运行
source、sh、bash、./
Shell变量
1使用变量
your_name="yuan"
echo $your_name
echo "I am ${yuan}jie"
2只读变量
#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"
3删除变量
unset myUrl
echo $myUrl
shell字符串
str='a string'
双引号
#双引号里可以有变量
#双引号里可以出现转义字符
your_name="yuan"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
拼接字符串
greeting="hello,"$your_name "!"
echo $greet
获取字符长度
string="abcd"
echo ${#string} --4
提取子字符串
echo ${string:0:2} --abc
查找子字符串
echo `expr index "$string" cd` --3
Shell数组
array_name=(a b c d)
echo ${array_name[@]}
#使用 @ 符号可以获取数组中的所有元素
获取数组的长度
echo ${#array_name[@]}
关联数组
declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"
echo ${site["runoob"]}
在数组前加一个感叹号 ! 可以获取数组的所有键
echo "数组的键为: ${!site[@]}"
Shell传递参数
#!/bin/bash
echo "Shell 传递参数实例!";
echo "第一个参数为:$1"; --1
echo "参数个数为:$#"; --3
echo "传递的参数作为一个字符串显示:$*"; --1 2 3
chmod +x test.sh
./test.sh 1 2 3
#则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
Shell运算符
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
#!/bin/bash
算术运算符
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val" --+
val=`expr $a \* $b`
echo "a * b : $val" --*
if [ $a == $b ]
then
echo "a 等于 b" --
fi
关系运算符
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
10 -eq 20: a 不等于 b 相等
10 -ne 20: a 不等于 b 不相等
10 -gt 20: a 不大于 b 左边的数是否大于右边的
10 -lt 20: a 小于 b 左边的数是否小于右边的
10 -ge 20: a 小于 b 左边的数是否大于等于右边的
10 -le 20: a 小于或等于 b 左边的数是否小于等于右边的
布尔运算符
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b: a 等于 b"
fi
if [ $a -lt 20 -o $b -gt 100 ] -o 或
if [ $a -lt 20 -a $b -gt 100 ] -a 与
逻辑运算符
if [[ $a -lt 100 && $b -gt 100 ]]
if [[ $a -lt 100 || $b -gt 100 ]]
字符串运算符
if [ -z $a ]
then = != -z
echo "-z $a : 字符串长度为 0" -n 长度是否不为0
else $ 字符串是否不为空
echo "-z $a : 字符串长度不为 0"
fi
文件测试运算符
#!/bin/bash
file="/var/www/runoob/test.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi
if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
if [ -f $file ]
then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
if [ -d $file ]
then
echo "文件是个目录"
else
echo "文件不是个目录"
fi
if [ -s $file ]
then
echo "文件不为空"
else
echo "文件为空"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
Shell echo命令
Shell printf 命令
#!/bin/bash
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 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
- 表示左对齐
Shell test 命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi --两个字符串不相等!
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
fi --至少有一个文件存在!
Shell 流程控制 ⭐
if for while until 循环
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
#case ... esac
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
跳出循环
脚本进入死循环直至用户输入数字大于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
continue 仅仅跳出当前循环:
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
Shell 函数⭐
带有return语句的函数:
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
带参数的函数示例:
#!/bin/bash
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
Shell 输入/输出重定向
# >> 追加到文件末尾
$ echo "yuan " >> users
$ cat users
madksmkda
yuan
$