shell脚本基础(备忘)

1、条件测试

两种格式:  test condition  或  [ condition ](注意两边加了空格)
condition可以是多个子条件的逻辑运算,逻辑运算符号有以下几种:

-a         逻辑与

-o        逻辑或

!          逻辑否

&&, ||

【实例】

$ ls aaa  &&  echo "yes"  ||  echo "no"

有文件aaa时会输出yes,否则输出no


2、文件测试

文件测试利用条件测试的方式测试一个文件或者目录的状态,如是否存在、是否可读等,具体的测试参数如下:

-d         目录

-f         普通文件(Regular file)

-L         符号链接

-r         Readable(文件、目录可读)

-b         块专用文件

-e         文件存在

-g         如果文件的set-group-id位被设置则结果为真

-s         文件长度大于0,非空

-z         文件长度=0

-w        Writable(文件、目录可写)

-u         文件有suid位设置

-x         Executable(文件可执行、目录可浏览)

-c         字符专用文件

-L         符号链接

例如测试文件file.txt是否存在,可以这样测试:

$test -e file.txt 或者 [ -e file.txt ]


3、字符串测试

字符串测试可以测试字符串是否为空,测试两个字符串是否相等等,具体的测试参数如下:

=         两字符串相等

!=        两字符串不等

-z         空串 [zero]

-n         非空串 [nozero]


4、数值测试

数值测试用于测试两个参数的大小、相等等情况,格式是:“number” numberic_operator “number” 或  [ “number” numberic_operator “number”],numberic_operator取值如下:

-eq       数值相等(equal)

-ne       不等(not equal)

-gt        A>B(greater than)

-lt         A<B(less than)

-le        A<=B(less、equal)

-ge       A>=B(greater、equal)

(疑问:好像不能用一个变量跟一个数值常量比较,要将值赋给变量然后比较两个变量,待考证!)


5、if结构

if 条件1
then 
      命令1
elif  条件2
then 
      命令2
else 
      命令3
fi


6、case结构

case variable in
       pattern [| pattern] …..) #匹配模式之间用"|"隔开
             命令….
             ;;
       模式2)
             命令…..
             ;;
       *) #匹配所有
             …….
             ;;
esac


7、for结构

for 变量名 in 列表
do
      命令1
      命令2
done

例子:

用于数值序列:
for loop in 1 2 3 4 5
for i in {1..10}
for ((i = 1; i <= 10; i++))

用于字符串序列:
for loop in “orange red blue grey”

用于命令的执行结果:
for loop in `ls`

无限循环:
for files in *


8、until结构

until  condition
do
      命令…..
done


9、while结构

while condition
do
      命令1
      命令2
done


10、bash 的组数(array)

一般而言,A="a b c def" 这样的变量只是将 $A 替换为一个单一的符串,
但是改为 A=(a b c def) ,则是将 $A 定义为组数...
bash 的组数替换方法可参考如下方法:
${A[@]} 或 ${A[*]} 可得到 a b c def (全部组数)
${A[0]} 可得到 a (第一个组数),${A[1]} 则为第二个组数...
${#A[@]} 或 ${#A[*]} 可得到 4 (全部组数数量)
${#A[0]} 可得到 1 (即第一个组数(a)的长度),${#A[3]} 可得到 3 (第四个组数(def)的长度)
A[3]=xyz 则是将第四个组数重新定义为 xyz ...


11、三个重要符号

hard quote:' ' (单引号),凡在 hard quote 中的所有 meta 均被关闭。
soft quote: " " (双引号),在 soft quoe 中大部份 meta 都会被关闭,但某些则保留(如 $ )。
escape : \ (反斜杠),只有紧接在 escape (跳脱字符)之后的单一 meta 才被关闭。

例如:命令echo '$0 outside function is '$0,第一个$0不会解开,直接输出字符"$0",而第二个$0会被解开,输出当前shell script的路径;

如果用命令echo "$0 outside function is "$0,则两个$0都会被解开,因此不能达到想要的结果。

(注意:在vim中编写shell script时,vim的颜色提示就可以看出符号是否解开,即是按普通字符串处理,还是按meta处理)


12、读取文件

读取文件的一行:read str < file.txt

逐行读取文件
while read line
do
       echo $line
done < file.txt



13、执行数值计算的三种方式

num1=123
num2=100

#(1)declare声明方式
declare -i sum=$num1+$num2

#(2)$(())操作符方式
sum=$((num1 + num2))

#(3)expr命令方式,$()为执行命令,expr是计算命令
sum=$(expr $num1 + num2 )

注意:方式1中+左右不能有空格,方式2可有可无,方式3中必须加空格,否则会按字符串方式连接; 另外,方式2中变量前的$符号可以省略。

14、shell变量详解(变量高级内容)

http://www.cnblogs.com/barrychiao/archive/2012/10/22/2733210.html


计算字符串长度:
 ${#string}

抽取子串:
 ${string:position}       #从名称为$string的字符串的第$position个位置开始抽取子串
 ${string:position:length}   #从名称为$string的字符串的第$position个位置开始抽取长度为$length的子串

删除子串:
 ${string#substring}    #删除string开头处与substring匹配的最短子串
 ${string##substring}  #删除string开头处与substring匹配的最长子串
 ${string%substring}    #删除string结尾处与substring匹配的最短子串
 ${string%%substring}   #删除string结尾处与substring匹配的最长子串

替换子串:
替换子串命令都是${…}格式,可以在任意处、开头处和结尾处替换满足条件的子串
 ${string/substring/replacement}          #仅替换第一次与substring相匹配的子串
 ${string//substring/replacement}        #替换所有与substring相匹配的子串
 ${string/#substring/replacement}         #替换string开头处与substring相匹配的子串
 ${string/%substring/replacement}        #替换string结尾处与substring相匹配的子串


【其他杂项】

  • ( ):将其内的命令置于 nestedsubshell 执行,或用于运算或命令替换。(变量修改是临时的)
  • { }:将其内的命令置于 non-namedfunction 中执行,或用在变量替换的界定范围。(变量修改对本shell有效)
  • ${ }或` `(反引号):用来做命令替换,也就是执行括号里面的命令行,然后返回命令行执行的结果。
  • $(( )):用来做整数计算。如:
    $ a=5; b=7; c=2
    $ echo $(( a+b*c ))
  • (( )):可重定义变量值,或作条件测试。如:
    a=5; ((a++)) 可将 $a 重定义为 6
    a=5; b=7; ((a < b)) 会得到0 (true) 的返回值。
  • 命令、函数或者shell脚本的返回值只有两种:0为"真"( true ),非0为"假"( false )
  • $#: 添加到Shell的参数个数
  • $$: Shell本身的PID(ProcessID)
  • $!: Shell最后运行的后台Process的PID
  • $?: 最后运行的命令的结束代码(返回值)
  • $*: 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
  • $@: 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
  • 为了防止打错变量名造成错误检查困难,可以设置:变量必须先声明(定义)才能使用!可以打开shell的选项(OPTNAME)nounset,关于选项可以执行set -o列出。打开该选项可以执行:set -o nounset 或者 shopt -s -o nounset









你可能感兴趣的:(shell脚本基础(备忘))