第一个shell
#!/bin/bash
echo "Hello World !"
- #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
- 运行
- chmod +x ./test.sh #使脚本具有执行权限
- ./test.sh #执行脚本
变量
字符串
your_name="qinjx"
echo $your_name
echo ${your_name}
your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
- 双引号里可以有变量
- 双引号里可以出现转义字符
- 获取字符串长度
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
数组
- 支持一维数组,不支持多维数组
- 用括号来表示数组,数组元素用"空格"符号分割开
array_name=(value0 value1 value2 value3)
array_name=(
value0
value1
value2
value3
)
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
valuen=${array_name[n]}
echo ${array_name[@]}
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
传递参数
- 向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推
- shell脚本传递的参数中如果包含空格,应该使用单引号或者双引号将该参数括起来,以便于脚本将这个参数作为整体来接收
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
括号用法
- 算术比较:-gt-lt-ge-le-eq-ne,可以通过 -a (and) 或 -o (or) 结合多个条件
[ $var -eq 0 ] # 当 $var 等于 0 时,返回真
[ $var -ne 0 ] # 当 $var 不等于 0 时,返回真
[ $var1 -ne 0 -a $var2 -gt 2 ] # 使用逻辑与 -a
[ $var1 -ne 0 -o $var2 -gt 2 ] # 使用逻辑或 -o
[[ $str1 = $str2 ]]
str1="Not empty"
str2=""
if [[ -n $str1 ]] && [[ -z $str2 ]];
then
echo str1 is nonempty and str2 is empty string.
fi
基本运算符
- expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2
- 完整的表达式要被
包含,注意这个字符不是常用的单引号
val=`expr 2 + 2`
echo "两数之和为 : $val"
echo
echo "It is a test" > myfile
printf
- printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
- %s %c %d %f都是格式替代符
- %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充
- %-4.2f 指格式化为小数,其中.2指保留2位小数。
test 命令
- test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
流程控制
if-else
if condition
then
command1
command2
...
commandN
fi
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi
for 循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
for((i=1;i<=5;i++));do
echo "这是第 $i 次调用";
done;
while 语句
while condition
do
command
done
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
until 循环
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
case
- 一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
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
跳出循环
- break命令允许跳出所有循环(终止执行后面的所有循环)
- continue命令不会跳出所有循环,仅仅跳出当前循环
函数
- 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
- 函数返回值在调用该函数后通过
?
来
获
得
,
? 来获得,
?来获得,? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得
- 所有函数在使用前必须定义
[ function ] funname [()]
{
action;
[return int;]
}
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
- 调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值
-
10
不
能
获
取
第
十
个
参
数
,
获
取
第
十
个
参
数
需
要
10 不能获取第十个参数,获取第十个参数需要
10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数
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
输入/输出重定向
- command > file: 将输出重定向到 file
- command < file: 将输入重定向到 file
- command >> file: 将输出以追加的方式重定向到 file
- command > /dev/null:/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃,将命令的输出重定向到它,会起到"禁止输出"的效果。
文件包含
- Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件
. filename # 注意点号(.)和文件名中间有一空格
或
source filename
#!/bin/bash
#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh
echo "$url"