Shell-学习笔记
-------------------------记录了我的Shell学习笔记----------------------------
TIPS:
1.shell文件第一行使用"#!"来表示使用什么程序来执行该脚本程序, 最好使用#!/bin/bash而不是#!/bin/sh, 当然也可以使用其他解释器
2.亦可以不用"#!"头, 而使用sh等命令来执行, 比如sh a.sh
3.若想使用./a.sh等形式直接执行, 1)头部需要加上用来解释本脚本的解释器 2)chmod [a|u|g|o]+x file #中括号内选一个
4.在shell中开启一个线程执行其他语句可以使用`...`、$(...)等形式
变量:
在Shell里, 每一个变量的值都是字符串, 无论给变量赋值的时候有没有使用引号, 值都会以字符串的形式存储.
1.变量赋值时"="左右不许有空格
name=John
2.需要注意shell的默认赋值是字符串赋值,
sum=1+1; echo $sum;
#结果输出"1+1"
3.算术运算, 为了达到上步想要的效果有以下几种表达方式
let "var+=1" 或者 let a++ 或者 let "var=1+1" 或者 let "var=var1+var2" var="$[var+1]" #执行算术运算 赋值给别的变量用的 $[]将中括号内的表达式作为数学运算先计算结果再输出
((var++)) #本身赋值用的 var=$((var+1)) #执行算术运算 赋值给别的变量用的
r=`expr var1 + var2` #注意空白
字符串:
可以用单引号、双引号、不用单双引号直接字符串(但有空格、分号什么的就得用引号了, 所以表示字符串最好最外加上引号), 单引号、双引号间区别为解释和不解释里面的特殊符号及变量, 比如 "!", $name等, 当双引号的时候使用echo "a{$name}"; 其中name为"John", 则输出"a{John}", 需要使用${var}形式, 在Shell里空格什么的可不能跟PHP样随意做分隔符用, 如果想输出大段字符串可以使用类似PHP中定界符形式来代替多次echo
cat <<TEXT AAA BBB CCC TEXT
顺带打印字符串函数:
echo 打印后自动换行 #echo 'abcd ${name}'
-n: 输出时不输出结尾换行符
-e: 使用转义序列 #echo "1\t2\t3" 会输出1制表符2制表符3
printf 打印后不会自动换行, 与C和PHP不同的是参数间以空格隔开 #printf "My name is %10s\n" "John_ABC"
if语句
if ....; then .... elif ....; then .... else .... fi
大多数情况下, 可以使用测试命令来对条件进行测试, 比如可以比较字符串、判断文件是否存在及是否可读等等……通常用"[]"来表示条件测试, 注意这里的空格很重要, 要确保方括号前后的空格
变量判断
[ -n "$var" ] #判断$var变量是否有值
文件判断
[ -r file "somefile"] #用户可读为真
[ -w file "somefile"] #用户可写为真
[ -x file "somefile"] #用户可执行为真
[ -f file "somefile"] #文件为正规文件为真
[ -d file "somefile"] #文件为目录为真
[ -c file "somefile"] #文件为字符特殊文件为真
[ -b file "somefile"] #文件为块特殊文件为真
[ -s file "somefile"] #文件大小非0时为真
[ -t file "somefile"] #当文件描述符(默认为1)指定的设备为终端时为真
数值比较
[ $a -eq $b] #两个数值是否相等 还有ne, le, lt, ge, gt #使用此种方式足够
(( $a < $b )) #注意使用(())
字符串比较(比较字符串使用""包含字符串变量是个好习惯)
[[ -n $str ]] #判断字符串不为null
[[ -z $str ]] #判断字符串为null, 长度为0
[[ "$test"x = "test"x ]] #可以使用=, <, <=, >, >=, !=, 字符串比较可以使用"["或者"[[", 但是在"["结构中"<"等字符都需要转义, 所以推荐只使用"[["形式, 都加个x字符避免变量为空
也可以使用 test [...]等来测试
&& 和 || 操作符
[ -d "somefile" ] || { echo "Can not read $mailfolder" ; exit 1; } #类似PHP和C的短路形式 后面使用{}保持一体容易阅读
case语句
case表达式可以用来匹配一个给定的字符串, 而不是数字(可别和C语言里的switch...case混淆), 匹配可以使用通配符
case ... in ...) do something here ;; #双分号结束 ...) do something here ;; #双分号结束
*) do something here #此处*匹配所有情况字符串, 即可代替C中的default
;; esac
select语句
select表达式是bash的一种扩展应用, 擅长于交互式场合, 与read不同的是用户可以从一组不同的值中进行选择, 而不是让用户输入
select var in ... ; do #注意此分号 break; #注意此break, 如果没有break将会一直循环下去 done .... now $var can be used ....
下面是一个简单的示例
#!/bin/bash echo "What is your favourite OS?" select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do break; done echo "You have selected $var"
可以配合select与case使用
#!/bin/bash echo 'What is your name?' select var in 'John' 'Nali'; do case $var in 'John') echo 'His name is John';; 'Nali') echo 'Her name is Nali';; *) echo 'No ever';; esac break; #注意此break, 如果没有break将会一直循环下去 done
while语句
while ...; do ....(break|continue) done
for语句
for var in ....; do #可以使用{1..10}, {a..z}, '1' '2', `seq 1 100`等形式做为数组 .... done
引号
引号可以忽略通配符的扩展, 比如现目录下有abc.jpg, bcd.jpg 执行以下命令会列出此两个文件abc.jpb bcd.jpg
ls *.jpg
如果使用以下命令则只会列出'*.jpg'(如果有的话)
ls '*.jpg' #或者 "*.jpg"
也可以使用转义符来忽略
ls \*.jpg
here