目录
前言
Shell编程——基础语法前半篇:Linux-3:Shell编程——基础语法(0-50%)-CSDN博客
一、数组
- 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),
- 初始化时不需要定义数组大小。 与大部分编程语言类似,数组元素的下标由 0 开始。
- Shell 数组用括号来表示,元素用"空格"符号分割开,
1.数组定义
两种定义方式
#!/bin/sh
# 数组
array=(1 2 A 4)
echo ${array[*]} # 数组取值 * 取全部
echo ${array[1]} # 下标取值
# 第二种定义方式
array1[0]=h
array1[1]=i
array1[2]=j
array1[3]=k
echo ${array1[@]} # @ * 取全部
echo ${array1[1]}
echo ${#array1[@]}
echo ${array1[*]}
输出:@ * 均能取全部的值
1 2 A 4
2
h i j k
i
4
h i j k
2.关联数组
- 嗯!是熟悉的味道
#!/bin/sh
# 关联数组 就是字典
declare -A dict=(["google"]="www.google.com" ["taobao"]="www.taobao.com")
echo ${dict["google"]}
declare -A dict_a
dict_a["sogou"]="www.sogou.com"
dict_a["google"]="www.google.com"
dict_a["taobao"]="www.taobao.com"
echo ${dict_a["sogou"]}
输出:关联数组通过键取值,且键必须唯一
www.google.com
www.sogou.com
3.数组长度
#!/bin/sh
declare -A dict=(["google"]="www.google.com" ["taobao"]="www.taobao.com")
declare -A dict_a
dict_a["sogou"]="www.sogou.com"
dict_a["google"]="www.google.com"
dict_a["taobao"]="www.taobao.com"
# 数组长度 # # 计算总数 @ * 取全部
echo ${#dict[@]}
echo ${#dict_a[*]}
输出:注意 !!! # 计算总数 @ * 取全部
2
3
二、运算符
1.算术运算符
#!/bin/sh
# 运算符
# 算术运算符
a=`expr 2 + 2 `
echo "两数之和为:$a"
b=`expr 2 - 2`
c=`expr 2 \* 2` # 乘需要转义\*
d=`expr 2 / 2`
e=`expr 2 % 2`
echo $b $c $d $e
# 第二种表达方式 $((表达式))
a1=$((2+2))
b1=$((2-2))
c1=$((2*2))
d1=$((2/2))
e1=$((2%2))
f1=$(($b1==$e1))
f2=$(($a1>=$b1))
echo $a1 $b1 $c1 $d1 $e1 $f1 $f2
输出:注意第一种表达中乘法需要转义*
两数之和为:4
0 4 1 0
4 0 4 1 0 1 1
2.关系运算符
- eq即equal ne即not equal g即great t即than l即less
举例:
#!/bin/sh
a1=$((2+2))
b1=$((2-2))
# 关系运算符 -eq == | -ne != | -gt > | -lt < | -ge >= | -le <=
if [ $a1 -eq $b1 ];
then
echo "a1==b1"
else
echo "a1!=b1"
fi
输出:
a1!=b1
3.布尔运算符
举例:
#!/bin/sh
# bool运算符 -a -o ! 与 或 非
a=10
b=20
if [ $a -gt 11 -o $b -lt 25 ];
then
echo "a大于11 或 b小于25"
else
echo "两个都为假"
fi
if [ ! $a -ne 10 ];
then
echo "a等于10"
else
echo "a不等于10"
fi
输出:
a大于11 或 b小于25
a等于10
4.逻辑运算符
举例:
#!/bin/sh
# 逻辑运算符 && || 与 或 返回布尔值
if [[ $a -gt 5 && $b -lt 21 ]];
then
echo "both true"
else
echo "have false"
fi
输出:注意逻辑算符外用的是两个中括号[[ ]]
have false
5.字符串运算符
举例:
#!/bin/sh
# 字符串运算符 = != -n -z(检测是否为0) $(检测是否不为空)
unset cc
if [ -n "$cc" ]; # ""引起来 判断是否有字符
then
echo "$cc"
echo "cc长度不为0"
else
echo "cc长度为0"
fi
输出:判断时需要用引号将变量引起来
cc长度为0
6.文件测试运算符
- 虽然看着唬人 但是我们只需要知道 -d -f -x 的用法即可
举例:
#!/bin/sh
# 文件测试运算符
dirs='/root/shell_code'
if [ -d $dirs ];
then
echo "${dirs}是一个文件夹"
else
echo "${dirs}不是一个文件夹"
fi
echo "------------------------------"
files="./demo1.sh"
if [ -f $files ];
then
echo "${files}是一个文件"
else
echo "${files}不是一个文件"
fi
echo "---------------------------"
if [ -x $files ];
then
echo "${files}是一个可执行文件"
else
echo "${files}不是一个可执行文件"
fi
输出:
/root/shell_code是一个文件夹
------------------------------
./demo1.sh是一个文件
---------------------------
./demo1.sh不是一个可执行文件
三、read命令
1.接收用户输入
- 类似于python里的inpu命令
#!/bin/sh
# 接收用户输入
read name
echo he is $name
输出:程序会获取用户输入的值,将其赋值给变量
hhh
he is hhh
2.开启转义
举例:
#!/bin/sh
# 开启转义
echo -e "ok \n"
echo -e "aaaaa \c " # \c 不换行
echo "hhhhh"
echo ` ps `
输出:
ok
aaaaa hhhhh
PID TTY TIME CMD 3450 pts/1 00:00:00 bash 5633 pts/1 00:00:00 sh 5634 pts/1 00:00:00 ps
3. -p 输入提示
举例:
# -p 输入提示
read -p "请输入您的年龄" age
echo "才${age}岁! 您还很年轻呢!"
输出:
请输入您的年龄23
才23岁! 您还很年轻呢!
4. -s 静默模式 -t 设置超时时间
#!/bin/sh
# -s 静默模式 -t 设置超时时间
read -p "请输入你的密码:" -s -t 10 passwd
echo
echo "你的密码是:${passwd}"
输出:静默模式下 输入的内容不会显示出来 -t 设置超过十秒后自动退出程序
请输入你的密码:
你的密码是:12345
5.读取多个参数
- 读取多个参数 中间用空格隔开
举例:
#!/bin/sh
# 读取多个参数 中间用空格隔开
read -p "请输入多个参数" name age sex
echo $name $age $sex
# 判断两次输入的密码是否相同
if read -t 20 -sp "请输入密码:" pass1 && echo &&
read -t 20 -sp "请再次输入密码:" pass2 && echo &&
[ $pass1 == $pass2 ];
then
echo "it's ok"
else
echo "it's failed"
fi
输出:
请输入多个参数hhhh aaaa
hhhh aaaa
请输入密码:
请再次输入密码:
it's failed
四、格式化字符串
- python有format
- shell有printf
举例:
#!/bin/sh
# printf 格式化字符串
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg # 使用 - 指定宽度
printf "%-10s %-8s %-8.2s\n" 郭靖 男 66.66666
printf "%-10s %-8s %-4.2s\n" zs man 88.8888 # 用英文时宽度是正常的
printf "%d %s\n" 1 "abc"
printf '%d %s\n' 1 "abc" # 只有在这里单引号不会将其他符号转换成字符串
printf %s abcdef"\n"
echo
printf %s abc def # 只指定了一个参数 有两个字符串 %s被重复使用
echo
printf "%s %s %s \n" a b c d e f h i j k l # %s %s %s \n 被复用
printf "%s %d %f %c \n" # %s用空代替 %d %f用0代替
输出:
- 英文字母通常使用ASCII码或Unicode编码的基本拉丁字母范围,每个字符占据一个固定的字节或字符宽度。例如,ASCII码中的大部分字母字符都是一个字节(8位)。
- 汉字则通常使用Unicode编码的中文字符集(如UTF-8编码),每个汉字通常占据3个字节(UTF-8编码下的标准长度),有时可能更多。
姓名 性别 体重kg
郭靖 男 66
zs man 88
1 abc
1 abc
abcdef\n
abcdef
a b c
d e f
h i j
k l
0 0.000000
总结
这里虽然用了if选择结构,但是很简单易懂,shell的选择和循环下一篇文章会讲。