shell学习日志
0.shell的变量同环境变量不同,存在用户环境区。 变量赋值的方式是: variable_name = variable_value a= "hello" $a对a进行取值 关于变量,还需要知道几个与其相关的Linux命令。 首个字符必须为字母(a-z,A-Z)。 中间不能有空格,可以使用下划线(_)。 不能使用标点符号。 env用于显示用户环境区中的变量及其取值; set用于显示本地数据区和用户环境区中的变量及其取值; unset用于删除指定变量当前的取值,该值将被指定为NULL; export命令用于将本地数据区中的变量转移到用户环境区。 1.if 的使用 if …; then … elif …; then … else … fi 2.循环语句 Shell Script中的循环有下面几种格式: while [ cond1 ] && { || } [ cond2 ] …; do … done for var in …; do … done for (( cond1; cond2; cond3 )) do … done until [ cond1 ] && { || } [ cond2 ] …; do … done example: for s in 1 2 3 4 do echo $s done for s in ‘this is a test!‘ do echo $s done 3.case case var in pattern 1 ) … ;; pattern 2 ) … ;; *) … ;; esac 4.使用说明 $#表示包括$0在内的命令行参数的个数,$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。$$ 表示当前Shell进程的ID,即pid,看下面的代码:$echo $$ 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 $# 传递给脚本或函数的参数个数。 $* 传递给脚本或函数的所有参数。 $@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 $? 上个命令的退出状态,或函数的返回值。 $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 $* 和 $@ 的区别 $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。 但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。 -lt 小于 -gt 大于 -le等于 例子:if [ $# -lt 3 ]; then... []表示条件测试,常用的条件测试有:[ -f "$file" ] 判断$file是否是一个文件 [ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于 [ -x "$file" ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性 [ -n "$a" ] 判断变量$a是否有值,测试空串用-z [ "$a" = "$b" ] 判断$a和$b的取值是否相等 [ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立 shift 将参数列表中的第一个,后面的参数依次变为新的第一 ,注意参数列表原本也不包括$0。 5.只读变量 readonly var 删除变量 unset var 变量被删除后不能再次使用;unset 命令不能删除只读变量。 6. Shell变量替换,命令替换,转义字符 a = 10 echo -e "$a \n" -e 表示对转义字符进行替换。输出10 不加-e输出10 \n 转义字符 含义 \\ 反斜杠 \a 警报,响铃 \b 退格(删除键) \f 换页(FF),将当前位置移到下页开头 \n 换行 \r 回车 \t 水平制表符(tab键) \v 垂直制表符 命令替换 命令替换的语法`command` 例:DATE=`date` echo "Date is $DATE" 变量替换 形式 说明 ${var} 变量本来的值 ${var:-word} 如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。 ${var:=word} 如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。 ${var:?message} 如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。 若此替换出现在Shell脚本中,那么脚本将停止运行。 ${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值。 7.shell的运算符 使用expr,它是一款表达式计算工具。例:val=`expr 2 + 2` echo "Total value : $val 算术运算符列表 运算符 说明 举例 + 加法 - 减法 \* 乘法 / 除法 % 取余 = 赋值 == 相等。用于比较两个数字,相同则返回 true。 != 不相等。用于比较两个数字,不相同则返回 true。 关系运算符 -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 -ge 检测左边的数是否大等于右边的,如果是,则返回 true。 -lt 检测左边的数是否小于右边的,如果是,则返回 true。 -gt 检测左边的数是否大于右边的,如果是,则返回 true。 -ne 检测两个数是否相等,不相等返回 true。 -eq 检测两个数是否相等,相等返回 true。 布尔运算符 !非运算,表达式为 true 则返回 false,否则返回 true。 -o 或运算,有一个表达式为 true 则返回 true。、 -a 与运算,两个表达式都为 true 才返回 true。 字符串运算符列表 运算符 说明 举例 = 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。 != 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。 -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。 -n 检测字符串长度是否为0,不为0返回 true。 [ -z $a ] 返回 true。 str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。 文件测试运算符列表 操作符 说明 举例 -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。 -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。 -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。 -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。 -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。 -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。 -p file 检测文件是否是具名管道,如果是,则返回 true。 [ -p $file ] 返回 false。 -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。 -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。 -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。 -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。 -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。 -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。 8.shell字符串 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的; 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。 双引号的优点: 双引号里可以有变量 双引号里可以出现转义字符 拼接字符串用双引号 取字符串长度:string="abcd" echo ${#string} #输出 4 提取子字符串:string="alibaba is a great company" echo ${string:1:4} #输出liba 查找子字符: string="alibaba is a great company" echo `expr index "$string" is` 从位置处抓取字串 expr substr "this is a test" 3 5 is is 9.shell 中数组 在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为: array_name=(value1 ... valuen) 获取数组的长度# 取得数组元素的个数 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得数组单个元素的长度 lengthn=${#array_name[n]} 10.重定向到文件 echo "abc">a.txt printf也可以输出 test 命令用于检查某个条件是否成立,与方括号([ ])类似。 11.case语句 echo "input a:" read a case $a in #1) echo "1");; 1) echo ‘You select 1‘;; 2) echo ‘2‘ ;; *) echo "oth" ;; esac 12.重定向 命令 说明 command > file 将输出重定向到 file。 command < file 将输入重定向到 file。 command >> file 将输出以追加的方式重定向到 file。 n > file 将文件描述符为 n 的文件重定向到 file。 n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。 n >& m 将输出文件 m 和 n 合并。 n <& m 将输入文件 m 和 n 合并。 << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 13.文件包含 像其他语言一样,Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本。 Shell 中包含脚本可以使用: . filename 或 复制纯文本新窗口 source filename
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。