Skip to content

Shell基础

变量的定义

bash
# 定义变量
name="zhangsan"
# 使用变量
echo $name
# 只读变量
readonly name
# 删除变量
unset name
# 定义变量
name="zhangsan"
# 使用变量
echo $name
# 只读变量
readonly name
# 删除变量
unset name

变量类型

bash
# 局部变量
# 在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
# 环境变量
# 所有程序,包括shell启动的程序,都能访问环境变量,有些程序需要依赖这些环境变量
# shell变量
# shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,还有一部分是shell程序自定义的变量
# 局部变量
# 在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
# 环境变量
# 所有程序,包括shell启动的程序,都能访问环境变量,有些程序需要依赖这些环境变量
# shell变量
# shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,还有一部分是shell程序自定义的变量

变量的引用

bash
# 单引号
# 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
# 双引号
# 双引号里可以有变量,双引号里可以出现转义字符
# 拼接字符串
# 使用双引号拼接
your_name="zhangsan"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
# 单引号
# 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
# 双引号
# 双引号里可以有变量,双引号里可以出现转义字符
# 拼接字符串
# 使用双引号拼接
your_name="zhangsan"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3

字符串

bash
# 字符串长度
string="abcd"
echo ${#string} # 输出 4
# 提取子字符串
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
# 查找子字符串
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
# 字符串长度
string="abcd"
echo ${#string} # 输出 4
# 提取子字符串
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
# 查找子字符串
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4

数组

bash
# 定义数组
array_name=(value0 value1 value2 value3)
# 读取数组
echo ${array_name[index]}
# 获取数组中的所有元素
echo ${array_name[@]}
# 获取数组的长度
echo ${#array_name[@]}
# 获取数组单个元素的长度
echo ${#array_name[n]}
# 定义数组
array_name=(value0 value1 value2 value3)
# 读取数组
echo ${array_name[index]}
# 获取数组中的所有元素
echo ${array_name[@]}
# 获取数组的长度
echo ${#array_name[@]}
# 获取数组单个元素的长度
echo ${#array_name[n]}

运算符

算术运算符

bash
# 加法
val=`expr 2 + 2`
echo "两数之和为 : $val"
# 减法
val=`expr 2 - 2`
echo "两数之差为 : $val"
# 乘法
val=`expr 2 \* 2`
echo "两数之积为 : $val"
# 除法
val=`expr 2 / 2`
echo "两数之商为 : $val"
# 取余
val=`expr 2 % 2`
echo "两数之余为 : $val"
# 赋值
a=10
b=20
# 相等
if [ $a == $b ]
then
   echo "a 等于 b"
fi
# 不相等
if [ $a != $b ]
then
   echo "a 不等于 b"
fi
# 加法
val=`expr 2 + 2`
echo "两数之和为 : $val"
# 减法
val=`expr 2 - 2`
echo "两数之差为 : $val"
# 乘法
val=`expr 2 \* 2`
echo "两数之积为 : $val"
# 除法
val=`expr 2 / 2`
echo "两数之商为 : $val"
# 取余
val=`expr 2 % 2`
echo "两数之余为 : $val"
# 赋值
a=10
b=20
# 相等
if [ $a == $b ]
then
   echo "a 等于 b"
fi
# 不相等
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

关系运算符

bash
# -eq	检测两个数是否相等,相等返回 true。	[ $a -eq $b ] 返回 false。
# -ne	检测两个数是否相等,不相等返回 true。	[ $a -ne $b ] 返回 true。
# -gt	检测左边的数是否大于右边的,如果是,则返回 true。	[ $a -gt $b ] 返回 false。
# -lt	检测左边的数是否小于右边的,如果是,则返回 true。	[ $a -lt $b ] 返回 true。
# -ge	检测左边的数是否大等于右边的,如果是,则返回 true。	[ $a -ge $b ] 返回 false。
# -le	检测左边的数是否小于等于右边的,如果是,则返回 true。	[ $a -le $b ] 返回 true。
# -eq	检测两个数是否相等,相等返回 true。	[ $a -eq $b ] 返回 false。
# -ne	检测两个数是否相等,不相等返回 true。	[ $a -ne $b ] 返回 true。
# -gt	检测左边的数是否大于右边的,如果是,则返回 true。	[ $a -gt $b ] 返回 false。
# -lt	检测左边的数是否小于右边的,如果是,则返回 true。	[ $a -lt $b ] 返回 true。
# -ge	检测左边的数是否大等于右边的,如果是,则返回 true。	[ $a -ge $b ] 返回 false。
# -le	检测左边的数是否小于等于右边的,如果是,则返回 true。	[ $a -le $b ] 返回 true。

布尔运算符

bash
# !	非运算,表达式为 true 则返回 false,否则返回 true。	[ ! false ] 返回 true。
# -o	或运算,有一个表达式为 true 则返回 true。	[ $a -lt 20 -o $b -gt 100 ] 返回 true。
# -a	与运算,两个表达式都为 true 才返回 true。	[ $a -lt 20 -a $b -gt 100 ] 返回 false。
# !	非运算,表达式为 true 则返回 false,否则返回 true。	[ ! false ] 返回 true。
# -o	或运算,有一个表达式为 true 则返回 true。	[ $a -lt 20 -o $b -gt 100 ] 返回 true。
# -a	与运算,两个表达式都为 true 才返回 true。	[ $a -lt 20 -a $b -gt 100 ] 返回 false。

逻辑运算符

bash
# &&	逻辑的 AND	[[ $a -lt 100 && $b -gt 100 ]] 返回 false
# ||	逻辑的 OR	[[ $a -lt 100 || $b -gt 100 ]] 返回 true
# &&	逻辑的 AND	[[ $a -lt 100 && $b -gt 100 ]] 返回 false
# ||	逻辑的 OR	[[ $a -lt 100 || $b -gt 100 ]] 返回 true

字符串运算符

bash
# =	检测两个字符串是否相等,相等返回 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。
# =	检测两个字符串是否相等,相等返回 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。

文件测试运算符

bash
# -b file	检测文件是否是块设备文件,如果是,则返回 true。	[ -b $file ] 返回 false。
# -c file	检测文件是否是字符设备文件,如果是,则返回 true。	[ -c $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。
# -b file	检测文件是否是块设备文件,如果是,则返回 true。	[ -b $file ] 返回 false。
# -c file	检测文件是否是字符设备文件,如果是,则返回 true。	[ -c $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。

流程控制

if else

bash
if condition
then
    command1 
    command2
    ...
    commandN 
fi
if condition
then
    command1 
    command2
    ...
    commandN 
fi

if else-if else

bash
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

for 循环

bash
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

while 语句

bash
while condition
do
    command
done
while condition
do
    command
done

until 循环

bash
until condition
do
    command
done
until condition
do
    command
done

case 语句

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

函数

定义函数

bash
# 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败
# 如果不加return语句,将以最后一条命令运行结果,作为返回值
# 函数返回值在调用该函数后通过 $? 来获得
# 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败
# 如果不加return语句,将以最后一条命令运行结果,作为返回值
# 函数返回值在调用该函数后通过 $? 来获得
demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
# 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败
# 如果不加return语句,将以最后一条命令运行结果,作为返回值
# 函数返回值在调用该函数后通过 $? 来获得
# 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败
# 如果不加return语句,将以最后一条命令运行结果,作为返回值
# 函数返回值在调用该函数后通过 $? 来获得
demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

函数参数

bash
# 在函数体内部,通过 $n 的形式来获取参数的值,例如,$1 表示第一个参数,$2 表示第二个参数...
# $10 不能获取第十个参数,获取第十个参数需要${10}
# 当 n>=10 时,需要使用 ${n} 来获取参数
# 可以不定义函数的返回值,所有函数在执行完毕后都返回0
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
# 在函数体内部,通过 $n 的形式来获取参数的值,例如,$1 表示第一个参数,$2 表示第二个参数...
# $10 不能获取第十个参数,获取第十个参数需要${10}
# 当 n>=10 时,需要使用 ${n} 来获取参数
# 可以不定义函数的返回值,所有函数在执行完毕后都返回0
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

函数返回值

bash
# 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败
# 如果不加return语句,将以最后一条命令运行结果,作为返回值
# 函数返回值在调用该函数后通过 $? 来获得
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}

funWithReturn
# 函数返回值在调用该函数后通过 $? 来获得
echo "输入的两个数字之和为 $? !"
# 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败
# 如果不加return语句,将以最后一条命令运行结果,作为返回值
# 函数返回值在调用该函数后通过 $? 来获得
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}

funWithReturn
# 函数返回值在调用该函数后通过 $? 来获得
echo "输入的两个数字之和为 $? !"

输入输出重定向

输出重定向

bash
# 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 之间的内容作为输入。
# 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 之间的内容作为输入。

Here Document

bash
# Here Document 是 Shell 中的一种特殊的重定向方式,它的基本的形式如下:
# command << delimiter
#     document
# delimiter
# 它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
# 注意:
# 结束符号必须顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
# 开始的delimiter前后的空格会被忽略掉。
# 由于 shell 会忽略掉其中的变量,所以不能有变量。
cat << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF
# Here Document 是 Shell 中的一种特殊的重定向方式,它的基本的形式如下:
# command << delimiter
#     document
# delimiter
# 它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
# 注意:
# 结束符号必须顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
# 开始的delimiter前后的空格会被忽略掉。
# 由于 shell 会忽略掉其中的变量,所以不能有变量。
cat << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF

/dev/null 文件

bash
# 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
# command > /dev/null
# /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。
# 但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
# 如果希望屏蔽 stdout 和 stderr,可以这样写:
# command > /dev/null 2>&1
# 或者
# command > /dev/null 2>&1 &
# 如果希望屏蔽 stdout 和 stderr,并且希望它在后台执行,可以这样写:
# command > /dev/null 2>&1 &
# 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
# command > /dev/null
# /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。
# 但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
# 如果希望屏蔽 stdout 和 stderr,可以这样写:
# command > /dev/null 2>&1
# 或者
# command > /dev/null 2>&1 &
# 如果希望屏蔽 stdout 和 stderr,并且希望它在后台执行,可以这样写:
# command > /dev/null 2>&1 &

文件包含

. filename

bash
# 使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者
# 使用以下包含文件代码
source ./test1.sh
# 使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者
# 使用以下包含文件代码
source ./test1.sh

信号处理

trap 命令

bash
# trap命令用于在shell脚本中捕获信号,并且对信号进行处理。
# trap命令的语法格式如下:
# trap commands signals
# 其中,commands表示要捕获的信号发生时,要执行的命令;signals表示要捕获的信号列表。
# 例如,下面的命令表示在shell脚本中捕获信号2和3,并且在信号发生时,执行命令echo "捕获到了信号":
trap "echo '捕获到了信号'" 2 3
# 信号列表可以是信号名称,也可以是信号编号。如果信号列表为空,则表示对所有信号进行处理。
# 例如,下面的命令表示在shell脚本中捕获所有信号,并且在信号发生时,执行命令echo "捕获到了信号":
trap "echo '捕获到了信号'"
# 如果不希望对某个信号进行处理,则可以将其指定为空字符串。例如,下面的命令表示在shell脚本中不对信号2进行处理:
trap "" 2
# 如果不希望对任何信号进行处理,则可以将其指定为空字符串。例如,下面的命令表示在shell脚本中不对任何信号进行处理:
trap ""
# 如果希望将某个命令作为信号的处理函数,则可以将其指定为一个函数名。例如,下面的命令表示在shell脚本中将函数myHandler作为信号2的处理函数:
trap myHandler 2
# 如果希望将某个命令作为信号的处理函数,则可以将其指定为一个函数名。例如,下面的命令表示在shell脚本中将函数myHandler作为信号2和3的处理函数:
trap myHandler 2 3
# 如果希望将某个命令作为信号的处理函数,则可以将其指定为一个函数名。例如,下面的命令表示在shell脚本中将函数myHandler作为所有信号的处理函数:
# trap命令用于在shell脚本中捕获信号,并且对信号进行处理。
# trap命令的语法格式如下:
# trap commands signals
# 其中,commands表示要捕获的信号发生时,要执行的命令;signals表示要捕获的信号列表。
# 例如,下面的命令表示在shell脚本中捕获信号2和3,并且在信号发生时,执行命令echo "捕获到了信号":
trap "echo '捕获到了信号'" 2 3
# 信号列表可以是信号名称,也可以是信号编号。如果信号列表为空,则表示对所有信号进行处理。
# 例如,下面的命令表示在shell脚本中捕获所有信号,并且在信号发生时,执行命令echo "捕获到了信号":
trap "echo '捕获到了信号'"
# 如果不希望对某个信号进行处理,则可以将其指定为空字符串。例如,下面的命令表示在shell脚本中不对信号2进行处理:
trap "" 2
# 如果不希望对任何信号进行处理,则可以将其指定为空字符串。例如,下面的命令表示在shell脚本中不对任何信号进行处理:
trap ""
# 如果希望将某个命令作为信号的处理函数,则可以将其指定为一个函数名。例如,下面的命令表示在shell脚本中将函数myHandler作为信号2的处理函数:
trap myHandler 2
# 如果希望将某个命令作为信号的处理函数,则可以将其指定为一个函数名。例如,下面的命令表示在shell脚本中将函数myHandler作为信号2和3的处理函数:
trap myHandler 2 3
# 如果希望将某个命令作为信号的处理函数,则可以将其指定为一个函数名。例如,下面的命令表示在shell脚本中将函数myHandler作为所有信号的处理函数:

调试 Shell 程序

执行选项

bash
# -c string 从字符串string中读取命令并执行
# -i 交互式运行shell
# -n 只读取命令,而不执行
# -r 以只读方式运行shell
# -s 从标准输入读取命令
# -x 执行命令后,显示该命令及其参数
# -c string 从字符串string中读取命令并执行
# -i 交互式运行shell
# -n 只读取命令,而不执行
# -r 以只读方式运行shell
# -s 从标准输入读取命令
# -x 执行命令后,显示该命令及其参数

调试选项

bash
# -v 显示shell输入行,同时输出结果
# -x 显示shell输入行,不输出结果
# -v 显示shell输入行,同时输出结果
# -x 显示shell输入行,不输出结果

调试脚本

bash
# bash -x script.sh
# bash -x script.sh

Shell 传递参数

参数处理

bash
# $0 为执行的文件名
# $1 是第一个参数
# $2 是第二个参数
# $3 是第三个参数
# $# 是传递到脚本的参数个数
# $* 是以一个单字符串显示所有向脚本传递的参数
# $$ 是脚本运行的当前进程ID号
# $! 是后台运行的最后一个进程的ID号
# $@ 是与$*相同,但是使用时加引号,并在引号中返回每个参数。
# $- 显示Shell使用的当前选项,与set命令功能相同。
# $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
# $0 为执行的文件名
# $1 是第一个参数
# $2 是第二个参数
# $3 是第三个参数
# $# 是传递到脚本的参数个数
# $* 是以一个单字符串显示所有向脚本传递的参数
# $$ 是脚本运行的当前进程ID号
# $! 是后台运行的最后一个进程的ID号
# $@ 是与$*相同,但是使用时加引号,并在引号中返回每个参数。
# $- 显示Shell使用的当前选项,与set命令功能相同。
# $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

传递参数实例

bash
# 实例
# 以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
# 执行脚本,输出结果如下所示:
# $ chmod +x test.sh
# $ ./test.sh 1 2 3
# Shell 传递参数实例!
# 执行的文件名:./test.sh
# 第一个参数为:1
# 第二个参数为:2
# 第三个参数为:3
# 实例
# 以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
# 执行脚本,输出结果如下所示:
# $ chmod +x test.sh
# $ ./test.sh 1 2 3
# Shell 传递参数实例!
# 执行的文件名:./test.sh
# 第一个参数为:1
# 第二个参数为:2
# 第三个参数为:3

Shell 数组

定义数组

bash
# 在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
# 数组名=(值1 值2 ... 值n)
# 例如:
array_name=(value0 value1 value2 value3)
# 也可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
# 可以不使用连续的下标,而且下标的范围没有限制。
# 例如:
array_name[0]=value0
array_name[1]=value1
array_name[3]=value3
# 读取数组
# 读取数组元素值的一般格式是:
# ${数组名[下标]}
# 例如:
valuen=${array_name[n]}
# 使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
# 获取数组的长度
# 获取数组长度的方法与获取字符串长度的方法相同,例如:
# # 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
# 取得数组单个元素的长度,例如:
lengthn=${#array_name[n]}
# 在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
# 数组名=(值1 值2 ... 值n)
# 例如:
array_name=(value0 value1 value2 value3)
# 也可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
# 可以不使用连续的下标,而且下标的范围没有限制。
# 例如:
array_name[0]=value0
array_name[1]=value1
array_name[3]=value3
# 读取数组
# 读取数组元素值的一般格式是:
# ${数组名[下标]}
# 例如:
valuen=${array_name[n]}
# 使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
# 获取数组的长度
# 获取数组长度的方法与获取字符串长度的方法相同,例如:
# # 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
# 取得数组单个元素的长度,例如:
lengthn=${#array_name[n]}

Shell 基本运算符

算术运算符

bash
# 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
# expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
# 例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
val=`expr 2 + 2`
echo "两数之和为 : $val"
# 注意:表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
# 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
# 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
# 注意:条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]。
# 例如:
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi
# 输出结果为:
# 两数之和为 : 4
# a + b : 30
# a - b : -10
# a * b : 200
# b / a : 2
# b % a : 0
# a 不等于 b
# 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
# expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
# 例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
val=`expr 2 + 2`
echo "两数之和为 : $val"
# 注意:表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
# 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
# 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
# 注意:条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]。
# 例如:
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi
# 输出结果为:
# 两数之和为 : 4
# a + b : 30
# a - b : -10
# a * b : 200
# b / a : 2
# b % a : 0
# a 不等于 b