From 205d253eb00c9e083bfec9ca55c3eccba4cbfb4f Mon Sep 17 00:00:00 2001 From: skywind3000 Date: Sun, 25 Feb 2018 00:24:27 +0800 Subject: [PATCH] update bash cheatsheet --- languages/bash.sh | 120 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 119 insertions(+), 1 deletion(-) diff --git a/languages/bash.sh b/languages/bash.sh index c73d3e6..c6110d0 100644 --- a/languages/bash.sh +++ b/languages/bash.sh @@ -1,6 +1,6 @@ ############################################################################## # BASH CHEATSHEET (中文速查表) - by skywind (created on 2018/02/14) -# Version: 8, Last Modified: 2018/02/24 22:06 +# Version: 9, Last Modified: 2018/02/25 00:24 # https://github.com/skywind3000/awesome-cheatsheets ############################################################################## @@ -119,6 +119,9 @@ su # 切换到 root 用户 su - # 切换到 root 用户并登陆(执行登陆脚本) su {user} # 切换到某用户 su -{user} # 切换到某用户并登陆(执行登陆脚本) +id {user} # 查看用户的 uid,gid 以及所属其他用户组 +id -u {user} # 打印用户 uid +id -g {user} # 打印用户 gid write {user} # 向某用户发送一句消息 @@ -227,6 +230,7 @@ declare -F # 查看所有函数,仅显示函数名 declare -i # 查看所有整数 declare -r # 查看所有只读变量 declare -x # 查看所有被导出成环境变量的东西 +declare -p varname # 输出变量是怎么定义的(类型+值) ${varname:-word} # 如果变量不为空则返回变量,否则返回 word ${varname:=word} # 如果变量不为空则返回变量,否则赋值成 word 并返回 @@ -256,11 +260,124 @@ text=$(IFS=/; echo "${array[*]}") # 用斜杠链接数组并赋值给变量 num=$((1 + 2)) # 计算 1+2 赋值给 num num=$(($num + 1)) # 变量递增 +num=$((num + 1)) # 变量递增,双括号内的 $ 可以省略 num=$((1 + (2 + 3) * 2)) # 复杂计算 $(UNIX command) # 运行命令,并将标准输出内容捕获并返回 +varname=$(id -u user) # 将用户名为 user 的 uid 赋值给 varname 变量 +############################################################################## +# 函数 +############################################################################## + +# 定义一个新函数 +function myfunc() { + # $1 代表第一个参数,$N 代表第 N 个参数 + # $# 代表参数个数 + # $0 代表被调用者自身的名字 + # $@ 代表所有参数,类型是个数组 + # $* 空格链接起来的所有参数,类型是字符串 + {shell commands ...} +} + +myfunc # 调用函数 myfunc +myfunc arg1 arg2 arg3 # 带参数的函数调用 +unset -f myfunc # 删除函数 +declare -f # 列出函数定义 + + +############################################################################## +# 条件判断(兼容 posix sh 的条件判断):man test +############################################################################## + +statement1 && statement2 # and 操作符 +statement1 || statement2 # or 操作符 + +exp1 -a exp2 # exp1 和 exp2 同时为真时返回真 +exp1 -o exp2 # exp1 和 exp2 有一个为真就返回真 +( expression ) # 如果 expression 为真时返回真,输入注意括号前反斜杆 +! expression # 如果 expression 为假那返回真 + +str1 = str2 # 判断字符串相等,如 [ "$x" = "$y" ] && echo yes +str1 != str2 # 判断字符串不等,如 [ "$x" != "$y" ] && echo yes +str1 < str2 # 字符串小于,如 [ "$x" \< "$y" ] && echo yes +str2 > str2 # 字符串大于,注意 < 或 > 是字面量,输入时要加反斜杆 +-n str1 # 判断字符串不为空(长度大于零) +-z str1 # 判断字符串为空(长度等于零) + +-a file # 判断文件存在,如 [ -a /tmp/abc ] && echo "exists" +-d file # 判断文件存在,且该文件是一个目录 +-e file # 判断文件存在,和 -a 等价 +-f file # 判断文件存在,且该文件是一个普通文件(非目录等) +-r file # 判断文件存在,且可读 +-s file # 判断文件存在,且尺寸大于0 +-w file # 判断文件存在,且可写 +-x file # 判断文件存在,且执行 +-N file # 文件上次修改过后还没有读取过 +-O file # 文件存在且属于当前用户 +-G file # 文件存在且匹配你的用户组 +file1 -nt file2 # 文件1 比 文件2 新 +file1 -ot file2 # 文件1 比 文件2 旧 + +num1 -eq num2 # 数字判断:num1 == num2 +num1 -ne num2 # 数字判断:num1 != num2 +num1 -lt num2 # 数字判断:num1 < num2 +num1 -le num2 # 数字判断:num1 <= num2 +num1 -gt num2 # 数字判断:num1 > num2 +num1 -ge num2 # 数字判断:num1 >= num2 + + +############################################################################## +# 流程控制:if 和经典 test,兼容 posix sh 的条件判断语句 +############################################################################## + +test {expression} # 判断条件为真的话 test 程序返回0 否则非零 +[ expression ] # 判断条件为真的话返回0 否则非零 + +test cond && cmd1 # 判断条件为真时执行 cmd1 +[ cond ] && cmd1 # 和上面完全等价 +[ cond ] && cmd1 || cmd2 # 条件为真执行 cmd1 否则执行 cmd2 + +test -e /tmp; echo $? # 调用 test 判断 /tmp 是否存在,并打印 test 的返回值 +[ -f /tmp ]; echo $? # 和上面完全等价,/tmp 肯定是存在的,所以输出是 0 + +# 判断 /etc/passwd 文件是否存在 +# 经典的 if 语句就是判断后面的命令返回值为0的话,认为条件为真,否则为假 +if test -e /etc/passwd; then + echo "alright it exists ... " +else + echo "it doesn't exist ... " +fi + +# 和上面完全等价,[ 是个和 test 一样的可执行程序,但最后一个参数必须为 ] +# 这个名字为 "[" 的可执行程序一般就在 /bin 或 /usr/bin 下面,比 test 优雅些 +if [ -e /etc/passwd ]; then + echo "alright it exists ... " +else + echo "it doesn't exist ... " +fi + +# 判断变量的值 +if [ "$varname" = "foo" ]; then + echo "this is foo" +elif [ "$varname" = "bar" ]; then + echo "this is bar" +else + echo "neither" +fi + +# 复杂条件判断,注意,小括号是字面量,实际输入时前面要加反斜杆 +if [ \( $x -gt 10 \) -a \( $x -lt 20 \) ]; then + echo "yes, between 10 and 20" +fi + +# 可以用 && 命令连接符来做和上面完全等价的事情 +[ \( $x -gt 10 \) -a \( $x -lt 20 \) ] && echo "yes, between 10 and 20" + +# 判断程序存在的话就执行 +[ -x /bin/ls ] && /bin/ls -l + ############################################################################## # References @@ -268,6 +385,7 @@ $(UNIX command) # 运行命令,并将标准输出内容捕获并返 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