shell - GameKong/wiki GitHub Wiki

一:基本常识

  1. #! 这个符号告诉系统用什么解释器来执行 shell 脚本。 通常是 #!/bin/bash
  2. 执行当前目录下的 xx.sh脚本, 使用命令 ./xx.sh,不可以使用 xx.sh。 因为xx.sh,系统会在PATH中查找,而不是当前目录

shell变量 1.变量定义不能有空格,不需要加$符号,例如:name="kongl" 2.使用一个变量时需要加$符号,花括号是可选的,加花括号是为了帮助解释器识别变量边界。 例如: name="mstring" echo $name echo "test string is ${name}value" 不给name加{},系统会认为namevalue是一个变量名,其值为空 3.只读变量,可以将变量定义为只读变量,例如: name="test_string" readOnly name name="test_string". -- 此步骤报错:/bin/sh: NAME: This variable is read only. 4.删除变量,unset命令可以删除变量,但是不能删除制度变量。例如 name="test_string" unset name echo $name -- 此步骤没有任何输出 5.变量类型 局部变量:在shell脚本或命令中定义的变量,仅在当前shell实例中有效,其他shell脚本不可见。 环境变量:所有程序,包括shell启动的程序,都能访问环境变量。必要的时候shell脚本也可以定义环境变量。 shell变量:shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,一部分是局部变量。 6.shell字符串,字符串可以由单引号和双引号表示 单引号限制: 单引号不可以在引号内加入变量。只能原样输出。 单引号内不可添加淡出一个单引号。必须成对出现,作为字符串拼接使用。 双引号优点: 双引号内可以添加变量。

例如:
	name="test_string"
	name2="this is ${name} !" <=> name2="this is "$name" !" <=> name2='this is '$name' !'  
	echo name2 -- 输出为 this is test_string !
	name3='this is ${name} !'  -- 输出为 this is ${name} !

7.获取字符串长度:使用#,例如: name="kong" echo ${#name} -- 输出4 8.截取字符串子串,例如: name="kongling" echo ${name:2:3} -- 输出ngl 9.从标准输入中读取一行用read,例如: read name -- 此步骤需要从控制台输入字符串,储存在name变量中 echo $name -- 打印从控制台输入的字符串

shell数组

1.数组用”括号“来表示,元素之间用“空格”符号分割开。起始索引为0,定义数组的一般形式例如: arr=(11 33 44 666) 或 arr=( 11 33 44 666
) 也可以单独定义某个元素,索引必须大于等于0且没有上限,例如: arr[999]=3

2.读取数组元素一般格式是 ${arr[index]},例如 value=${arr[0]} 3.使用@获取数组全部元素。例如 echo ${arr[@]} 4.获取数组元素个数使用 ${#arr[@]} 或 ${arr[*]}

shell注释 1.单行注释,在行开头使用#即可。 2.多行注释,例如以下形式,EOF可以为任何字符 :<<EOF ..注释内容 ..注释内容 ... EOF

二:传递参数

1.在shell脚本中获取参数的格式为:$n, n代表一个数字,代表执行脚本的第n个参数,例如: 脚本内容: #!bin/bash name1=$1 name2=$2 echo $name1 echo $name2 控制台执行: sh ./xx.sh kong ling 输出: kong ling

2.$@表示所有的参数,$与$@相同,$#表示传递给脚本的参数个数 $ 与 $@ 区别: 相同点:都是引用所有参数。 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3, 则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

三:shell运算符

1.算数运算,使用expr,例如: echo expr 2 + 2 --数字与运算符中间加空格 1.+、-、*、/、%、 使用形如 expr 1 + 1的方式计算, *需要加转义字符\,例如expr 1 \* 2。MAC中的expr可以用$((1 * 2))表示,*不需要转义字符。 2.赋值使用 a=$b的形式 3.相等==,不相等!= 使用如下形式: [ $a == $b ] 4.关系运算符,只支持数字,不支持字符串,除非字符串是数字。以下为关系运算符及其用法: 1.等于: -eq [ $a -eq $b ] 2.不等于: -ne [ $a -ne $b ] 3.小于: -lt [ $a -lt $b ] 4.大于 -gr [ $a -gr $b ] 5.大于等于 -ge [ $a -ge $b ] 6.小于等于 -le [ $a -le $b ] 5.布尔运算符,以下为布尔运算符及其用法: 1.非运算: ! !false 返回true 2.或运算 -o [ false -o true ] 返回true 3.与预算 -a [ false -a true ] 返回false 6.逻辑运算符,以下为逻辑运算符及其用法: 1.或运算 || false 返回true 2.与预算 && false && true 返回false 7.字符串运算符,以下为字符串运算符及其用法: 1.检测字符串是否相等 == [ $a == $b ] 2.检测字符串是否不相等 != [ $a != $b ] 3.检测字符串长度是否为0 -z [ -z $a ] 4.检测字符串长度是否不为0 -n [ -n $a ] 5.检测字符串是否为空 $ [ $a ] 8.文件测试运算符,以下为文件测试运算符: 1.检测文件是否为目录 -d [ -d $file ] 2.检测文件是否为普通文件(既不是目录,也不是设备文件) -f [ -f $file ] 3.检测文件是否可读 -r [ -r $file ] 4.检测文件是否可写 -w [ -w $file ] 5.检测文件是否可执行 -x [ -x $file ] 6.检测文件是否不为空 -s [ -s $file ] 7.检测文件是否存在 -e [ -e $flie ]

四:echo显示

1.显示执行结果使是xxx或"$(xxx)", 例如: 1.echo date 或者是 echo "${date}" -- 2020年 4月26日 星期日 15时03分52秒 CST 2.echo pwd 或者是 echo "${pwd}". -- /Users/kongling/Desktop/shell3.txt 2.换行或不换行显示 换行: echo "123123\n456456" 不换行:echo "123123\c456456" 3.将结果定向到文件: echo "此内容写入文件test.txt" > test1.txt -- 将字符串写入到当前工作目录下的test1.txt文件中,若没有该文件则创建该文件。

五:printf显示

1.printf不会像echo一样在末尾自动添加换行符,但是自己可以在字符串末尾添加\n。 2.printf基本语法:printf format-string [arguments...],例如: printf "格式字符串测试%d,%s,%.3f" -- 格式字符串测试1,sss,1.500

六.test命令

linux命令

  1. vi/vim:vi/vim 文件名, 这个命令可以在当前目录下编辑文件,创建后 输入 i ,进入编辑模式, 编辑完成后,点击esc, 然后输入 :wq! ,可保存编辑并退出
  2. chmod:开启 .sh 脚本执行权限 可用 命令 chmod +x ./xxx.sh 。 符号意义 +增加, -减少, =唯一权限 。r读权限, w写权限,x执行权限。 也可用数字代替, r=4,w=2,x=1, chmod abd file, abc 分别代表u(用户),g(gruop),o(other)。 例如 chmod 777 test.sh 代表给所用人赋予 读写执行的权限