Shell学习笔记

#!/bin/bash
echo "Hello World!"

for i in $(ls /home);do
echo $i
done

name='zpb'
str="Are you \"$name\"?"
echo $str ${#name} #转义字符、字符长度

greeting='Are you ${name}?'
echo $greeting
echo ${greeting:0:5} #提取字符串

array=(0 1 2 3 4 5 6 7 8 9)
value=${array[7]}
echo $value
echo ${array[@]} #获取整个数组

:<<'cmmt' #注释
babablabalala
balabalabal
baakd
cmmt

echo -e "\nShell传参实例"
echo "第一个参数:$1,第二个参数:$2"
echo "参数个数:$#"
echo "传递的参数作为一个字符串显示:$*"

echo -e "\nOK!" #显示换行
echo -c "\cOK!" #显示不换行
echo "脚本的进程号:$$"
echo "后台运行的最后一个进程号:$!"
echo "最后命令的退出状态:$?"
echo '原样输出字符串:$name\"'

#声明一个关联数组site
declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"
echo "数组的键为:${!site[*]}${!site[@]}"
echo "数组的值为:${site[*]}"
echo "数组的值为:${site[@]}"
echo "数组元素个数为:${#site[*]}${#site[@]}"

# $*$@区别:都是引用所有参数字,前者等价于一个参数”1 2 3“,后者相当于”1“ ”2“ ”3“三个参数
echo -e "\n-- \$* 演示 ---"
for i in "$*"; do
echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done

echo -e "\n算数运算符:"
val1=`expr $1 + $2` #表达式和运算符之间要有空格,例如 2+2 是不对的,完整的表达式要被``包含!!!
val2=`expr $1 \* $2`
echo "两数之积为:$val2 两数之和为: $val1"

echo -e "\n关系运算符:"
a=10 b=20
result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"

if [ $a -eq $b ]
then
echo "$a -eq $b: a ≠ b"
else
echo "$a -eq $b: a ≠ b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a ≠ b"
else
echo "$a -ne $b: a = b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a > b"
else
echo "$a -gt $b: a ≤ b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a < b"
else
echo "$a -lt $b: a ≥ b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a ≥ b"
else
echo "$a -ge $b: a < b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a ≤ b"
else
echo "$a -le $b: a > b"
fi

if (( $a == $b ))
then
echo "a == b"
elif (( $a > $b ))
then
echo "a > b"
elif (( $a < $b ))
then
echo "a < b"
else
echo "没有符合的条件"
fi

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi

echo -e "\n布尔运算符:"
if [ $a != $b ]
then
echo "$a != $b : a ≠ b"
else
echo "$a == $b: a = b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a<100 $b>15 : 返回 true"
else
echo "$a<100 $b>15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a<100 $b>100 : 返回 true"
else
echo "$a<100 $b>100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a<5 $b>100 : 返回 true"
else
echo "$a<5 $b>100 : 返回 false"
fi

echo -e "\n逻辑运算符:"
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi

echo -e "\n字符串运算符:"
a="abc"
b="efg"

if [ $a = $b ] # 等价于:if test $[a] -eq $[b] if test $a = $b
then
echo "$a = $b : a = b"
else
echo "$a = $b: a ≠ b"
fi
if [ $a != $b ]
then
echo "$a != $b : a ≠ b"
else
echo "$a != $b: a = b"
fi
if [ -z $a ]
then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ] # 等价于:if test -n "$a"
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi

echo -e "\n文件运算符:"
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 ] # 等价于:if test -s $file
then
echo "文件是个目录"
else
echo "文件不是个目录"
fi
if [ -s $file ] # 等价于:if test -s $file
then
echo "文件不为空"
else
echo "文件为空"
fi
if [ -e $file ] # 等价于:if test -e $file
then
echo "文件存在"
else
echo "文件不存在"
fi

printf "\n%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234

echo -e "\nFor循环输出字符串:"
for str in This is a string
do
echo $str
done

int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done

#until执行循环体直至条件为 true 时停止
#abc=0
#until [ ! $abc -lt 10 ]
#do
# echo $abc
# a=`expr $abc + 1`
#done

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

while :
do
echo -n "输入 1 5 之间的数字:" # -n表示不在最后自动换行
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 5 之间的! 游戏结束"
break
;;
esac
done

echo -e "\n定义函数——加法器:"
funWithReturn(){
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

echo -e "\n函数参数:"
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第五个参数为 $5 !"
echo "第十个参数为 $10 !" #n>=10时,需要使用${n}来获取参数。
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# !"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73


#Shell文件包含
#test1.sh代码如下:
url="http://www.runoob.com"
#test2.sh代码如下:
#. ./test1.sh
echo -e "\n菜鸟教程官网地址:$url"

text="jiajieshixiaokouchangkai jiajieshixiangchijiuchi"
echo $text > myfile #name变量的值写入myfile
echo `date` #显示命令执行结果

echo -e "\nwc -l命令计算Doc的行数:"
wc -l << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF
echo -e "\ncat命令查看Doc内容:"
cat << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF

运行结果:

 

root@htxt:/home# ./status.sh 2 5 8
Hello World!
admin
bakup.sh
bs_bbu_main
file
ip.sh
myfile
odiDebugCommand.txt
revert.sh
status.sh
tcpdump_access.pcap
tcpdump_dl.pcap
tcpdump.pcap
zzx
Are you "zpb"? 3
Are you ${name}?
Are y
7
0 1 2 3 4 5 6 7 8 9

Shell传参实例
第一个参数:2,第二个参数:5
参数个数:3
传递的参数作为一个字符串显示:2 5 8

OK!
-c \cOK!
脚本的进程号:19044
后台运行的最后一个进程号:
最后命令的退出状态:0
原样输出字符串:$name\"

 

 

数组的键为:google runoob taobao或google runoob taobao

数组的值为:www.google.com www.runoob.com www.taobao.com
数组的值为:www.google.com www.runoob.com www.taobao.com
数组元素个数为:3和3

-- $* 演示 ---
2 5 8
-- $@ 演示 ---
2
5
8

 

 

算数运算符:
两数之积为:10 两数之和为: 7

 

 

关系运算符:
result 为: 30
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
a < b
两个数字相等!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

布尔运算符:
10 != 20 : a ≠ b
10<100 且 20>15 : 返回 true
10<100 或 20>100 : 返回 true
10<5 或 20>100 : 返回 false

 

 

 

 

 

 

 

 

 

 

 

 

 

逻辑运算符:
返回 false
返回 true

 

 

 

 

 

 

字符串运算符:
abc = efg: a ≠ b
abc != efg : a ≠ b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 文件运算符:

文件不可读
文件不可写
文件不可执行
文件为特殊文件
文件不是个目录
文件为空
文件不存在

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

姓名     性别   体重kg

郭靖     男      66.12

For循环输出字符串:
This
is
a
string
1
2
3
4
5

 

 

 

 

 

输入 1 到 3 之间的数字:
你输入的数字为:
1
你选择了 1
输入 1 到 5 之间的数字:5
你输入的数字为 5!
输入 1 到 5 之间的数字:3
你输入的数字为 3!
输入 1 到 5 之间的数字:9
你输入的数字不是 1 到 5 之间的! 游戏结束

 

 

 

 

 

 

 

 

定义函数——加法器:
输入第一个数字:
23
输入第二个数字:
32
两个数字分别为 23 和 32 !
输入的两个数字之和为 55 !

函数参数:
第一个参数为 1 !
第二个参数为 2 !
第五个参数为 5 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

 

 

 

 

 

 

菜鸟教程官网地址:http://www.runoob.com
2023年 08月 23日 星期三 09:36:59 CST

 

 

wc -l命令计算Doc的行数:
3

cat命令查看Doc内容:
欢迎来到
菜鸟教程
www.runoob.com

 

posted on 2023-08-23 09:49  图像处理工程师  阅读(18)  评论(0编辑  收藏  举报