注意点
通配符和正则表达式不同 特别是 * 这个符号 通配符:零到无限多个字符的意思 正则表达式:重复零到无限多个前一个字符的意思
${name} 取出变量结果 $(date) 在括号中执行命令,然后读取出命令结果,拿到它 `` 和上一个类似 $name 取出变量结果
数值计算
shell 的一些基础命令,只支持整数的运算,小数的计算需要如 bc 这样的命令
(( ))
1 2 3 4 5 6 7 8 9 10 11
| echo $((3 + 4)) echo $((10 / 3)) echo $((5 ** 2)) echo $((3 < 4 && 5 == 5)) echo $((2 * 1.5))
num=5 echo $((num = num * 3)) echo $num b=$((num = num * 3)) echo $((b++))
|
let
效果等同于双括号 效率更低一点
1 2 3
| num=8 num=num+2 let num=num+2
|
expr
必须以参数的形式传递,所以要有空格 但是一些元字符有特殊含义,需要加转移字符
1 2 3 4
| expr 5 \* 3 expr 5 + 3 expr length 123abc expr 5 \> 7
|
也可模式匹配 : 冒号,计算字符串的数量 .* 任意的字符重复 0 次或者多次 所以可用于 shell 脚本中判断后缀是否正确,因为不正确会返回 0
1 2 3 4 5 6 7
| expr ycpng.png ":" ".*" expr ycpng.png ":" ".*p" expr ycpng.png ":" ".*png"
name=ycpng.png echo ${name#*png}
|
bc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| bc
echo "4.2*3" | bc echo "10/3" | bc echo {1..100} | tr " " "+" | bc
seq -s "+" 100 | bc
echo $((`seq -s "+" 100`))
seq -s " + " 100 | xargs expr
|
基础
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
if [ num -ne 1 ] then 执行体 elif 条件表达式 then 执行体 else 执行体 fi
if 条件表达式; then 执行体
case $op in "1" ) 执行体 ;; "2" ) 执行体 ;; "*" ) 执行体 ;; esac
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
while [ 条件判断式 ] do 执行体 done
for str in I am a handsome boy do 执行体 done
s=0 for (( i=1; i<=10; i++ )) do s=$(( $s+$i )) done
echo $s
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
function func(){ 执行体 return 返回值 }
func
function func(){ echo ok echo no return 0 } func
function func(){ echo ok echo no return 0 }
function func(){ echo $1 echo $2 return 0 } func $1 $2
bash a.sh "a" "b"
|
条件测试
在这里的运用 || 和 && 这符号有所区别 && 是指前者成功,也执行后者;前者失败,都不执行 || 是指前者失败,执行后者,前者成功,不执行后者
test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| -e 该文件是否存在(目录、文件、等等都能) -f 该文件名是否为文件(file) -d 该文件名是否为目录(directory) -c 该文件名是否为一个 character device 装置 -s 该文件名是否为一个 Socket 文件 -p 该文件名是否为一个 FIFO(pipe)文件 -n 内容是否不为空,不空为 true
-r 检测文件名是否具有可读的属性 -w 检测文件名是否具有可写的属性 -x 检测文件名是否具有可执行的属性 -u 检测文件名是否具有 SUID 的属性 -g 检测文件名是否具有 SGID的属性 -k 检测文件名是否具有 Sticky bit 属性 -s 检测文件名是否为非空白的文件
-eq 两数值相等(equal) -ne 两数值不等(not equal) -gt n1 大于 n2(greater than) -lt n1 小于 n2(less than) -ge n1 大于等于 n2(greater than or equal) -le n1 小于等于 n2()less than or equa1)
-a 两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 和 x 权限时,才回传 true -o 两状况任何一个成立 ! 反向状态,如 test ! -x file,当 file 不具有 x 时,返回 true
test -z string 判定字符串是否为 0 ?若 string 为空字符串,则为 true test -n string 判定字符串是否为 非0 ?若 string 为空字符串,则为 false。 注:-n 亦可省略 test str1 = str2 判定 str1 是否等于 str2 ,若相等,则回传 true test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false
|
中括号
作用和 test 一样 和 if 一样,需要左右两边加空格
1 2 3
| [ -f "$filename" ]
[ -f "$filename" ] && echo ok
|
双中括号
各种比较逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
== 判断是否相等 != 判断是不等的 ! 去结果的反义
name="hh" [ "$name" == "hh" ] && echo ok || echo no [ ! -f filename ] && echo ok || echo no
[[ 1 < 2 ]] && echo ok || echo no [ 1 \< 2 ] && echo ok || echo no [ 1 -lt 2 ] && echo ok || echo no [[ 1 -lt 2 ]] && echo ok || echo no
|


xingzhu
keep trying!keep doing!believe in yourself!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 星竹!