Shell基础语法回顾
【摘要】 # 1、变量var="hello" # 直接定义,等号前后没有空格echo $var # 引用变量,也可以用${var},后者更安全# shell中'', "", ``的作用:# 单引号,硬转义,单引号内的字符就是其字面意义,阻止shell进行变量替换和解释特殊字符。# 会进行变量替换;将整个字符串解释为一个整体,即使参数里面含有空白字符也不会被shell分割开。# 反撇号,...
# 1、变量
var="hello" # 直接定义,等号前后没有空格
echo $var # 引用变量,也可以用${var},后者更安全
# shell中'', "", ``的作用:
# 单引号,硬转义,单引号内的字符就是其字面意义,阻止shell进行变量替换和解释特殊字符。
# 会进行变量替换;将整个字符串解释为一个整体,即使参数里面含有空白字符也不会被shell分割开。
# 反撇号,相当于$()--命令替换,会用命令执行的输出替换,建议使用$()形式。
# 特殊变量
变量 描述
$0 第一个参数,也就是脚本名字
$n 执行脚本时传入的参数,第一个参数是$1
$# 执行脚本是传入的参数总数,不包括脚本名称本身
$* 所有的参数,但不包括$0,在加引号时,作为一个整体
$@ 所有的参数,但不包括$0,在加引号时,不作为一个整体,而是拆开
$? 前一个命令的退出状态,一般0为成功
$$ shell脚本本身进程的进程id
$! shell最后运行的后台进程id
# 2、数组
array=("python" "shell" "java" "golang") # 直接定义数组
echo ${array[1]} # 引用第2各元素,下标从0开始
array=(`ls /home/`) # 通过命令结果生成数组
${!array[@]} # 数组所有索引
${array[@]} # 数组所有值
# 3、运算符
# 条件运算符要放在[]内,且前后各一个空格,且中间运算符两边均有空格,等价于test
# 但更通用的是使用[[]]替代[]
# 算术运算符
# ==只能用来判断数字的关系,!=可以判断数字,也可以判断字符串
if [ $a == $b ];then
echo "a等于b"
fi
if [ $a != $b ];then
echo "a不等于b"
fi
# 条件运算符,也是仅能用于数值的判断
-eq 检测两个数是否相等,相等返回 true。
-ne 检测两个数是否不相等,不相等返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
# 布尔运算符、逻辑运算符
! 非运算
-o 或运算 ||
-a 与运算 &&
# 字符串运算符
= 检测两个字符串是否相等,相等返回 true。
!= 检测两个字符串是否不相等,不相等返回 true。
-z 检测字符串长度是否为0,为0返回 true。
-n 检测字符串长度是否不为 0,不为 0 返回 true。
$ 检测字符串是否为空,不为空返回 true。
# 文件测试运算符
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-r file 检测文件是否可读,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。
-s file 检测文件是否不为空,如果是返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
# 4、分支语句
# if else语句
if condition1;then
comand1
elif condition2;then
comand2
else
comand3
fi
# case语句
case value in
p1)
command1
;;
pa2)
command2
;;
*)
comand3
esac
# 5、循环语句
# for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
# while语句
while condition
do
command
done
# 6、函数
# 定义
funcname(){
echo "start"
var="TEST"
return $var
}
# 调用
funcname p1 p2 ... # 后面是参数
# 7、文件读写
# for循环实现逐行读文件
for line in `cat test.txt`
do
echo $line
done
# while循环实现逐行读文件
while read line
do
echo $line
done < test.txt
# 写文件,可以通过重定向 > 与 >>
echo "xxxxx" > test.txt # 覆盖写入
echo "xxxxx" >> test.txt # 追加写入
# 8、常用文本处理命令
# echo命令
echo -e "xxx" #开启转义,这样\n会被解释成换行符
# grep命令
grep -参数 路径或文件名
或者 cat 文件名 |grep -参数
-i 忽略大小写
-o 只显示匹配部分的内容
-v 显示不匹配的行
-r 递归的方式查找
# wc命令
wc -参数 文件名
或者 cat 文件名 |wc -参数
-l 行数
-w 字数
-c 字节数
# printf函数
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐)。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
# 多行文本写入文件EOF
cat > eof.txt << EOF #覆盖写入
> wsx
> edc
> EOF
cat >> eof.txt << EOF #追加写入
> wsx
> edc
> EOF
# sed命令(行处理)
sed '2,5d' testfile #删除2-5行,$表示最后一行
sed '/systemctl/d' testfile # 删除含有systemctl的行
sed -n '4,6p' testfile #打印第4-6行,-n会取消原本的默认输出
sed 's/oldstr/newstr/g' testfile #将oldstr替换为newstr
sed '2a\11111111' testfile #第2行后插入111111
sed '2i\11111111' testfile #第2行前插入111111
# cut命令(列处理)
cut -b 3 testfile # 以字节分割,输出第三列
cat testfile |cut -c 3 # 以字符分割,输出第三列
cat testfile |cut -d '-' -f 3 # 以自定义分隔符-分割(默认制表符),输出第3
# 正则
\ 转义。例如,'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 。
^ 匹配开始位置。
$ 匹配结束位置。
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
? 匹配前面的子表达式零次或一次。
{n} n 是一个非负整数。匹配确定的n次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
. 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式。
x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\w 匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。
\W 匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)