shell脚本学习

shell脚本

打印输出
echo
  • 是Shell的一个内部指令,用于在屏幕上打印出指定的字符串。
echo arg 
echo -e arg #执行arg里的转义字符。echo加了-e默认会换行
echo arg > myfile #显示结果重定向至文件,会生成myfile文件

注意,echo后单引号和双引号作用是不同的。单引号不能转义里面的字符。双引号可有可无,单引号主要用在原样输出中。

printf

printf 命令的语法:

printf  format-string  [arguments...]
#format-string 为格式控制字符串,arguments 为参数列表。功能和用法与c语言的 printf 命令类似。

这里仅说明与C语言printf()函数的不同:

  • 格式化输出语句
  • printf 不像 echo 那样会自动换行,必须显式添加换行符(\n)
  • printf 命令不用加括号
  • format-string 可以没有引号,但最好加上,单引号双引号均可。
  • 参数比格式控制符(%)多时,格式控制符可以重用,可以将所有参数都转换。
  • arguments 使用空格分隔,不用逗号。
# 双引号
printf "%d %s\n" 10 "abc"
10 abc
# 单引号与双引号效果一样 
printf '%d %s\n' 10 "abc" 
10 abc
# 没有引号也可以输出
printf %s abc
abc
# 但是下面的会出错:
printf %d %s 10 abc 
#因为系统分不清楚哪个是参数,这时候最好加引号了。
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
$ printf %s a b c
abc
$ printf "%s\n" a b c
a
b
c
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
$ printf "%s and %d \n" 
and 0
# 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
$ printf "The first program always prints'%s,%d\n'" Hello Shell
-bash: printf: Shell: invalid number
The first program always prints 'Hello,0'

read
  • 命令行从输入设备读入内容
#!/bin/bash
# Author : lalal
echo -n "What is your name?" # -n不换行,echo默认换行
read NAME #从键盘读取输入输入
echo "Hello, $NAME"
#!/bin/bash
# Author : lalal
echo "What is your name?"
read -p "What is your name?" NAME #输入
echo "Hello, $NAME"
变量
命名规则:
  • 变量名和等号之间不能有空格
  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格可以使用下划线(_)
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

在变量前面加readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

my_name="Asa"
readonly url
url="http://www.baidu.com"
使用变量
my_name="Asa"
echo $my_name
echo ${my_name}

备注:后两句效果一样,均为输出变量的值。变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界。

变量类型

运行shell时,会同时存在三种变量:
1) 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。

特殊变量

前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量

变量含义
$0当前脚本的文件名
$n传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2
$#传递给脚本或函数的参数个数。
$*传递给脚本或函数的所有参数。
$@传递给脚本或函数的所有参数。被双引号(“ “)包含时,与 $* 稍有不同
$?上个命令的退出状态,或函数的返回值。
$$当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

示例:

#!/bin/bash
echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

运行结果:

$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
$*$@ 的区别

$*$@ 都表示传递给函数或脚本的所有参数,不被双引号(“ “)包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

但是当它们被双引号(“ “)包含时,”$*“ 会将所有的参数作为一个整体,以”$1 $2 … $n“的形式输出所有参数;”$@“ 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

示例:

#!/bin/bash
echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@"
echo "print each param from \$*"
for var in $*
do
    echo "$var"
done
echo "print each param from \$@"
for var in $@
do
    echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
    echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
    echo "$var"
done

执行 ./test.sh "a" "b" "c" "d",看到下面的结果:

$*=  a b c d
"$*"= a b c d
$@=  a b c d
"$@"= a b c d
print each param from $*
a
b
c
d
print each param from $@
a
b
c
d
print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d
退出状态

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。

示例:

if [[ $? != 0 ]];then
  echo "error"
  exit 1;
fi

退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

不过,也有一些命令返回其他值,表示不同类型的错误。

转义字符
转义字符    含义
\\    反斜杠
\a    警报,响铃
\b    退格(删除键)
\f    换页(FF),将当前位置移到下页开头
\n    换行
\r    回车
\t    水平制表符(tab键) 
\v    垂直制表符

shell默认是不转义上面的字符的。需要加-e选项。

举个例子:

#!/bin/bash
a=11
echo -e "a is $a \n"

运行结果:

Value of a is 10

这里 -e 表示对转义字符进行替换。如果不使用 -e 选项,将会原样输出:

Value of a is 10\n

可以使用 echo 命令的 -E 选项禁止转义,默认也是不转义的;使用 -n 选项可以禁止插入换行符。

命令替换

命令替换是指Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出。

语法:

`command`

注意是反引号,不是单引号,这个键位于 Esc 键下方。

下面的例子中,将命令执行结果保存在变量中:

#!/bin/bash
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 的值。
一个完整的shell示例

下面的脚本用于php安装过程中安装zip扩展。

#!/bin/bash
#zip install
if [ -d php-5.4.25/ext/zip ];then
    cd php-5.4.25/ext/zip
else
    tar zxvf php-5.4.25.tar.gz
    cd php-5.4.25/ext/zip
fi
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
[ $? != 0 ] && exit
make install
echo 
grep 'no-debug-zts-20100525' /usr/local/php/etc/php.ini
if [ $? != 0 ];then
        echo '' >> /usr/local/php/etc/php.ini
        echo 'extension_dir=/usr/local/php/lib/php/extensions/no-debug-zts-20100525' >> /usr/local/php/etc/php.ini
fi
grep 'zip.so' /usr/local/php/etc/php.ini
if [ $? != 0 ];then
    echo 'extension=zip.so' >> /usr/local/php/etc/php.ini
fi
echo "zip install is OK"
/usr/local/apache2/bin/apachectl restart
cd -
rm -rf php-5.4.25
echo "all ok!"
ls /usr/local/php/lib/php/extensions/no-debug-zts-20100525/

脚本中的符号含义
$$
  • Shell本身的PID(ProcessID)
$!
  • Shell最后运行的后台Process的PID
$?
  • 最后运行的命令的结束代码(返回值)
$-
  • 使用Set命令设定的Flag一览
$*
  • 所有参数列表。如"$*“用 “” 括起来的情况、以”$1 $2 … $n"的形式输出所有参数。
$@
  • 所有参数列表。如"$@“用 “” 括起来的情况、以”$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数。
$#
  • 添加到Shell的参数个数
$0
  • Shell本身的文件名
1 ~ 1~ 1n
  • 添加到Shell的各参数值。$1是第1参数、 2 是第 2 参数 … 。 2是第2参数…。 2是第2参数{10}及以上需要用{}括起来。
循环
条件判断:
if

if 语句语法格式:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

写成一行(适用于终端命令提示符):

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

末尾的fi就是if倒过来拼写,后面还会遇到类似的。

if else

if else 语法格式:

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi
if else-if else

if else-if else 语法格式:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

示例:

#!/bin/bash
a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

输出结果:

a 小于 b

for 循环

一般格式:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
#!/bin/bash
for x in `seq 9`
do
	for y in `seq $x`
	do
		printf "$y * $x = $(($x*$y))\t"
	done
	printf "\n"
done

for ((x=1;x<=9;x++))
do
	for ((y=1;y<=$x;y++))
	do
		printf "$y * $x = $(($x*$y))\t"
	done
	printf "\n"
done

for x in {1..9}
do
	for y in `seq $x`
        do
                printf "$y * $x = $(($x*$y))\t"
        done
        printf "\n"
done
1 * 1 = 1
1 * 2 = 2	2 * 2 = 4
1 * 3 = 3	2 * 3 = 6	3 * 3 = 9
1 * 4 = 4	2 * 4 = 8	3 * 4 = 12	4 * 4 = 16
1 * 5 = 5	2 * 5 = 10	3 * 5 = 15	4 * 5 = 20	5 * 5 = 25
1 * 6 = 6	2 * 6 = 12	3 * 6 = 18	4 * 6 = 24	5 * 6 = 30	6 * 6 = 36
1 * 7 = 7	2 * 7 = 14	3 * 7 = 21	4 * 7 = 28	5 * 7 = 35	6 * 7 = 42	7 * 7 = 49
1 * 8 = 8	2 * 8 = 16	3 * 8 = 24	4 * 8 = 32	5 * 8 = 40	6 * 8 = 48	7 * 8 = 56	8 * 8 = 64
1 * 9 = 9	2 * 9 = 18	3 * 9 = 27	4 * 9 = 36	5 * 9 = 45	6 * 9 = 54	7 * 9 = 63	8 * 9 = 72	9 * 9 = 81
1 * 1 = 1
1 * 2 = 2	2 * 2 = 4
1 * 3 = 3	2 * 3 = 6	3 * 3 = 9
1 * 4 = 4	2 * 4 = 8	3 * 4 = 12	4 * 4 = 16
1 * 5 = 5	2 * 5 = 10	3 * 5 = 15	4 * 5 = 20	5 * 5 = 25
1 * 6 = 6	2 * 6 = 12	3 * 6 = 18	4 * 6 = 24	5 * 6 = 30	6 * 6 = 36
1 * 7 = 7	2 * 7 = 14	3 * 7 = 21	4 * 7 = 28	5 * 7 = 35	6 * 7 = 42	7 * 7 = 49
1 * 8 = 8	2 * 8 = 16	3 * 8 = 24	4 * 8 = 32	5 * 8 = 40	6 * 8 = 48	7 * 8 = 56	8 * 8 = 64
1 * 9 = 9	2 * 9 = 18	3 * 9 = 27	4 * 9 = 36	5 * 9 = 45	6 * 9 = 54	7 * 9 = 63	8 * 9 = 72	9 * 9 = 81
1 * 1 = 1
1 * 2 = 2	2 * 2 = 4
1 * 3 = 3	2 * 3 = 6	3 * 3 = 9
1 * 4 = 4	2 * 4 = 8	3 * 4 = 12	4 * 4 = 16
1 * 5 = 5	2 * 5 = 10	3 * 5 = 15	4 * 5 = 20	5 * 5 = 25
1 * 6 = 6	2 * 6 = 12	3 * 6 = 18	4 * 6 = 24	5 * 6 = 30	6 * 6 = 36
1 * 7 = 7	2 * 7 = 14	3 * 7 = 21	4 * 7 = 28	5 * 7 = 35	6 * 7 = 42	7 * 7 = 49
1 * 8 = 8	2 * 8 = 16	3 * 8 = 24	4 * 8 = 32	5 * 8 = 40	6 * 8 = 48	7 * 8 = 56	8 * 8 = 64
1 * 9 = 9	2 * 9 = 18	3 * 9 = 27	4 * 9 = 36	5 * 9 = 45	6 * 9 = 54	7 * 9 = 63	8 * 9 = 72	9 * 9 = 81

写成一行:

for var in item1 item2 ... itemN; do command1; command2… done;

当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。   in列表是可选的,如果不用它,for循环使用命令行的位置参数。 例如,顺序输出当前列表中的数字:

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

输出:

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

顺序输出字符串中的字符:

for str in 'This is a string'
do
    echo $str
done

输出结果:

This is a string

while语句

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

while condition
do    
	command
done

以下是一个基本的while循环,测试条件是:如果int小于等于5,那么条件返回真。int从0开始,每次循环处理时,int加1。运行上述脚本,返回数字1到5,然后终止。

#!/bin/sh
int=1
while(( $int<=5 ))
do
        echo $int
        let "int++"
done

输出:

1
2
3
4
5

使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令 。while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按结束循环。

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的电影名: '
while read FILM
do
    echo "是的!$FILM 是一部好电影"
done

输出:

按下 <CTRL-D> 退出
输入你最喜欢的电影名: w3cschool菜鸟教程
是的!w3cschool菜鸟教程 是一部好电影
无限循环

无限循环语法格式:

while :
do
    command
done

或者

while true
do    
	command
done

或者

for (( ; ; ))

until 循环

until循环执行一系列命令直至条件为真时停止。 until循环与while循环在处理方式上刚好相反。 一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。 until 语法格式:

until condition
do    
	command
done

条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。


分支控制:case

取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。case语句格式如下:

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。

case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 下面的脚本提示输入1到4,与每一种模式进行匹配:

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

# 输入为
输入 14 之间的数字:
你输入的数字为:
3
你选择了 3
#!/bin/bash
option="${1}"
case ${option} in
   "-f")
      FILE="${2}"
      echo "File name is $FILE"
      ;;
   "-d")
      DIR="${2}"
      echo "Dir name is $DIR"
      ;;
   *)
      echo "`basename ${0}`:usage: [-f file] | [-d directory]"
      exit 1 # Command to come out of the program with status 1
      ;;
esac

#输出为
$./test.sh
test.sh: usage: [ -f filename ] | [ -d directory ]
./test.sh -f index.html
File name is index.html
跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。

break 命令

break命令允许跳出所有循环(终止执行后面的所有循环)。 下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done

# 输出为
输入 15 之间的数字:3
你输入的数字为 3!
输入 15 之间的数字:7
你输入的数字不是 15 之间的! 游戏结束
#!/bin/bash
i=0
while [ $i -lt 5 ]
do
    i=`expr $i + 1`
    if [ $i == 3 ]
        then
            break
    fi
    echo -e $i
done

#输出为
1
2
continue

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。 对上面的例子进行修改:

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done
# 运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo “Game is over!” 永远不会被执行。
#!/bin/bash
i=0
while [ $i -lt 5 ]
do
    i=`expr $i + 1`
    if [ $i == 3 ]
        then
            continue
    fi
    echo -e $i
done

# 输出为
1
2
4
5
Shell运算符

Bash 支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。

算术运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

# 命令行直接计算
expr 2 + 2   #4
expr 3 - 2   #1
expr 3 / 2   #1
expr 3 \* 2   #6
# 使用表达式
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"

注意:

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 乘号(*)前边必须加反斜杠()才能实现乘法运算
  • 完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

算术运算符列表

运算符    说明        举例
+        加法    `expr $a + $b` 结果为 30。
-       减法    `expr $a - $b` 结果为 10。
*        乘法    `expr $a \* $b` 结果为  200。
/        除法    `expr $b / $a` 结果为 2。
%        取余    `expr $b % $a` 结果为 0=        赋值    a=$b 将把变量 b 的值赋给 a。
==        相等。用于比较两个数字,相同则返回 true。    [ $a == $b ] 返回 false。
!=        不相等。用于比较两个数字,不相同则返回 true。    [ $a != $b ] 返回 true。
关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
   echo "$a -eq $b : a is equal to b"
else
   echo "$a -eq $b: a is not equal to b"
fi

缩成一行可以这样:

a=10;b=20;if [ $a -eq $b ];then echo "$a -eq $b : a is equal to b"; else echo "$a -eq $b: a is not equal to b"; fi

这里缩写,主要是为了让大家注意:

  • if后面直到then前面的分号结束,都是有空格的: if [ $a -eq $b ]

关系运算符列表

运算符    说明
-eq    检测两个数是否相等,相等返回 true。同算数运算符`==`
-ne    检测两个数是否相等,不相等返回 true
-gt    检测左边的数是否大于右边的,如果是,则返回 true。
-lt    检测左边的数是否小于右边的,如果是,则返回 true。
-ge    检测左边的数是否大等于右边的,如果是,则返回 true。
-le    检测左边的数是否小于等于右边的,如果是,则返回 true。
布尔运算符

布尔运算符列表

运算符    说明
!    非运算,表达式为 true 则返回 false,否则返回 true。
-o    或运算(or),有一个表达式为 true 则返回 true。
-a    与运算(and),两个表达式都为 true 才返回 true。
if [ 3 -eq 3 -a 3 -lt 5 ]
then
    echo 'ok'
fi;
字符串运算符

字符串运算符列表

运算符    说明    举例
=    检测两个字符串是否相等,相等返回 true。    [ $a = $b ] 返回 false。
!=    检测两个字符串是否相等,不相等返回 true。    [ $a != $b ] 返回 true。
-z    检测字符串长度是否为0,为0返回 true。    [ -z $a ] 返回 false。
-n    检测字符串长度是否为0,不为0返回 true。    [ -n $a ] 返回 true。
str    检测字符串是否为空,不为空返回 true。    [ $a ] 返回 true。
  • $str1 == $str2 #字符串是否相等

  • $str1 != $str2 #字符串是否不相等

#!/bin/bash
STRING=

if [ "$str1" == "$str2" ]; then
 echo "字符串相等"
fi
if [ "$str1" != "$str2" ]; then
 echo "字符串不相等"
fi
  • -z :判断 string 是否是空串

  • -n :判断 string 是否是非空串

#!/bin/bash
STRING=

if [ -z "$STRING" ]; then
 echo "STRING is empty"
fi
if [ -n "$STRING" ]; then
 echo "STRING is not empty"
fi
文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

#!/bin/sh
file="/tmp/test.sh"
if [ -e $file ]
then
   echo "File exists"
else
   echo "File does not exist"
fi

文件测试运算符列表

操作符    说明    举例
-e 文件存在
-d 目录 
-s 文件长度大于 0、非空 判断文件是否为空用 [ -s filename ]
-f 正规文件 
-w 可写
-L 符号连接 
-u 文件有suid位设置
-r 可读 
-x 可执行
-b 这是一个块设备(软盘,光驱等)
-c 这是一个字符设备
-p 这个文件是一个管道
-h 这是一个符号链接
-S 这是一个socket
-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。
#!/bin/bash
if [ ! -e /tmp/1.txt ]
then
	touch /tmp/1.txt
fi
if [ ! -d /tmp/testdir ]
then
	mkdir /tmp/testdir 
fi
数组

在Shell中,用括号来表示数组,数组元素用空格符号分割开。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。定义数组的一般形式为:

array_name=(value1 value2 ... valuen)
array_name=(
    value0
    value1
    value2
    value3
)
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

可以不使用连续的下标,而且下标的范围没有限制。

下面来读取数组:

echo ${array_name[2]} #读取下标为2的元素
echo ${array_name[*]} #读取所有元素
echo ${array_name[@]} #读取所有元素
echo ${#array_name[*]} #获取数组长度
echo ${#array_name[@]} #获取数组长度
echo ${#array_name[1]} #获取数组中单个元素的长度

输出:

value2
value0 value1 value2 value3
value0 value1 value2 value3
4
4
6
函数
  • 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 参数返回,可以显示加 return 返回,若不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
  • $10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
Ding_Webhook_Token=******
function sendDingDing()
{
    curl -s https://oapi.dingtalk.com/robot/send?access_token="$Ding_Webhook_Token" \
    -H 'Content-Type: application/json' \
    -d '{"msgtype": "markdown","markdown": {"title": "综合数据备份","text": "'"$*"'"},"at": {"isAtAll": true}}' 2>&1 > /dev/null
}

#调用函数
senDingDing
#!/bin/bash
function sum(){
    case $# in 
        0) echo "no param";;
        1) echo $1;;
        2) echo `expr $1 + $2`;;
        3) echo `expr $1 + $2 + $3`;;
        *) echo "$# params! It's too much!";;
    esac
}
sum 1 3 5 6
函数参数
参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值