diff --git a/languages/bash.sh b/languages/bash.sh index c6110d0..7a9da71 100644 --- a/languages/bash.sh +++ b/languages/bash.sh @@ -1,6 +1,6 @@ ############################################################################## # BASH CHEATSHEET (中文速查表) - by skywind (created on 2018/02/14) -# Version: 9, Last Modified: 2018/02/25 00:24 +# Version: 10, Last Modified: 2018/02/25 01:03 # https://github.com/skywind3000/awesome-cheatsheets ############################################################################## @@ -329,19 +329,22 @@ num1 -ge num2 # 数字判断:num1 >= num2 ############################################################################## -# 流程控制:if 和经典 test,兼容 posix sh 的条件判断语句 +# 分支控制:if 和经典 test,兼容 posix sh 的条件判断语句 ############################################################################## test {expression} # 判断条件为真的话 test 程序返回0 否则非零 [ expression ] # 判断条件为真的话返回0 否则非零 -test cond && cmd1 # 判断条件为真时执行 cmd1 -[ cond ] && cmd1 # 和上面完全等价 -[ cond ] && cmd1 || cmd2 # 条件为真执行 cmd1 否则执行 cmd2 +test "abc" = "def" # 查看返回值 echo $? 显示 1,因为条件为假 +test "abc" != "def" # 查看返回值 echo $? 显示 0,因为条件为真 test -e /tmp; echo $? # 调用 test 判断 /tmp 是否存在,并打印 test 的返回值 [ -f /tmp ]; echo $? # 和上面完全等价,/tmp 肯定是存在的,所以输出是 0 +test cond && cmd1 # 判断条件为真时执行 cmd1 +[ cond ] && cmd1 # 和上面完全等价 +[ cond ] && cmd1 || cmd2 # 条件为真执行 cmd1 否则执行 cmd2 + # 判断 /etc/passwd 文件是否存在 # 经典的 if 语句就是判断后面的命令返回值为0的话,认为条件为真,否则为假 if test -e /etc/passwd; then @@ -358,6 +361,9 @@ else echo "it doesn't exist ... " fi +# 和上面两个完全等价 +[ -e /etc/passwd ] && echo "alright it exists" || echo "it doesn't exist" + # 判断变量的值 if [ "$varname" = "foo" ]; then echo "this is foo" @@ -378,6 +384,67 @@ fi # 判断程序存在的话就执行 [ -x /bin/ls ] && /bin/ls -l +# 如果不考虑兼容 posix sh 和 dash 这些的话,可用 bash 独有的 ((..)) 和 [[..]]: +https://www.ibm.com/developerworks/library/l-bash-test/index.html + + +############################################################################## +# 流程控制:while / for / case / until +############################################################################## + +# while 循环 +while condition; do + statements +done + +i=1 +while [ $i -le 10 ]; do + echo $i; + i=$(expr $i + 1) +done + +# for 循环:上面的 while 语句等价于 +for i in {1..10}; do + echo $i +done + +for name [in list]; do + statements +done + +# for 列举某目录下面的所有文件 +for f in /home/*; do + echo $f +done + +# bash 独有的 (( .. )) 语句,更接近 C 语言,但是不兼容 posix sh +for (( initialisation ; ending condition ; update )); do + statements +done + +# 和上面的写法等价 +for ((i = 0; i < 10; i++)); do echo $i; done + +# case 判断 +case expression in + pattern1 ) + statements ;; + pattern2 ) + statements ;; + * ) + otherwise ;; +esac + +# until 语句 +until condition; do + statements +done + +# select 语句 +select name [in list]; do + statements that can use $name +done + ############################################################################## # References @@ -386,6 +453,7 @@ fi https://github.com/LeCoupa/awesome-cheatsheets/blob/master/languages/bash.sh https://ss64.com/bash/syntax-keyboard.html http://wiki.bash-hackers.org/commands/classictest +https://www.ibm.com/developerworks/library/l-bash-test/index.html