shell编程入门1
初步尝试
#!/bin/bash
# 表示宿主目录,对于root用户,~表示为/root,如果是其他普通用户,~表示的是/home/用户名
cd ~
# 创建test目录
mkdir test
touch test.txt
echo "hello,world" > test.txt
cat test.txt
cd ..
# 整个目录删除
rm -rf test
[root@master project]# sh second1.sh
hello,world
优化:将test.txt和test目录用变量代替
#!/bin/bash
DEPLOY_DIR=test
USE_FILE=test.txt
# 表示宿主目录,对于root用户,~表示为/root,如果是其他普通用户,~表示的是/home/用户名
cd ~
# 创建test目录
mkdir DEPLOY_DIR
touch USE_FILE
echo "hello,world" > USE_FILE
cat USE_FILE
cd ..
# 整个目录删除
rm -rf DEPLOY_DIR
优化:创建test失败的场景 ,默认 set +e命令遇见错误会继续执行,set -e遇见错误,停止运行
优化:使用外部传入文件目录
#!/bin/bash
# 默认 set +e命令遇到错误会继续执行,set -e 遇到错误,停止运行
#set -e
if [ $# -eq 1 ]
then
DEPLOY_DIR=$1
fi
if [ $# -eq 2 ]
then
USE_FILE=$2
fi
DEPLOY_DIR=test
USE_FILE=test.txt
# 表示宿主目录,对于root用户,~表示为/root,如果是其他普通用户,~表示的是/home/用户名
cd ~
# 创建test目录
mkdir DEPLOY_DIR
touch USE_FILE
echo "hello,world" > USE_FILE
# cat USE_FILE
echo "输出${USE_FILE}文件的内容...":
cd ..
# 整个目录删除
rm -rf DEPLOY_DIR
echo
#!/bin/bash
echo "hello, world"
echo hello, world , 你好
[root@master project]# sh echo.sh
Hello World
hello, world, 你好
第一行 会保留空格,原样输出,输出内容用引号
第二行会保留一个一个空格后,去掉多余的空格
var1="a b c d"
echo $var1
echo "$var1"
a b c d
a b c d
echo常用选项
-
-n不带默认的换行
# 默认输出的最后会有一个换行符 echo "hello" # 不要加上默认的换行符 echo -n "hello"
hello
hello[root@master project]#
举例:在同一行中接收输入参数
echo -n "Please input your name: "
read name
echo "Hello, $name"
会接收键盘输入,并输出hello xxx
- -e:解释字符串中出现的转义符
echo -e "hello\nwor\tld"
- echo输出带颜色的字符,31me为红色,32为绿色,33为黄色,34为蓝色
echo -e "\033[31mhello \033[0m"
echo -e "\033[32mhello \033[0m"
echo -e "\033[33mhello \033[0m"
echo -e "\033[34mhello \033[0m"
var
#!/bin/bash
var1=hello
echo $var1
var1_xyz=abc
# 期望输出heelo,xyz
echo "输出\$var1_xyz=$var1_xyz"
实际会输出abc,将代码改造为${var1}_xyz
echo "继续输出${var1}_xyz"
就可以输出heelo,xyz
declare
declare显示指定类型
- -i 指定整形
- -r 只读变量
- -a 指定数组
- -f 指定函数名
declare -i var3
var3=xyz
echo "\$var3=$var3"
输出结果为0, 0为默认值。
var3=245
echo "\$var3=$var3"
输出245
declare -r var4=abc
var4=xyz
echo $var4
输出报错,只读数据,不允许赋值
declare会输出系统的变量
[root@master project]# var1=xyz
[root@master project]# declare | grep 'var1'
var1=xyz
declare > /dev/null # 输出系统中定义的变量,包括系统变量
set
# declare 同义命令set
unset var1 #清除变量var1
declare | grep 'var1'
执行后为空,已清除var1的值
# ``:反引号 $():获取里面的Linux命令的执行结果
LOCAL_IP=`cat /etc/hosts | grep \`hostname\` | awk '{print $1}'`
LOCAL_IP_OTHER=$(cat /etc/hosts | grep `hostname` | awk '{print $1}')
echo "\$LOCAL_IP=$LOCAL_IP,\$LOCAL_IP_OTHER=$LOCAL_IP_OTHER"
输出$LOCAL_IP=172.16.1.100,$LOCAL_IP_OTHER=172.16.1.100
array
#!/bin/bash
arr1=(xxx xyz "hello, world" 1234 20.0)
# 获取数组的长度
echo "数组arr1的长度:${#arr1[@]}"
[root@master project]# echo "数组arr1的长度:${#arr1[@]}"
数组arr1的长度:5
# 如果没有指定下标,默认为index[0]的元素,
echo ${arr1}
xxx
# index为1的元素 第二个元素
echo ${arr1[1]}
xyz
# 最后一个元素
end_len=${#arr1[@]}
end_index=`expr $end_len - 1`
echo ${arr1[$end_index]}
第二个定义数组的方式
arr2[0]=abc
arr2[1]=xyz
arr2[2]="世界 你好"
arr2[3]=1234
echo "arr2数组的内容:$arr2{2[@]}"
echo "arr2数组的长度:${#arr2[@]}"
arr2数组的内容:abc xyz 世界 你好 1234
arr2数组的长度:4
遍历数组
# 常用的遍历数组的方式
for i in `seq 0 $end_index`
do
pos=`expr $i+1`
echo "arr2中第${pos}位置的元素为:${arr2[$i]}"
done
count=1
for ele in "${arr1[@]}"
do
echo "arr2中第${count}位置的元素为:$ele"
count=`expr $count + 1`
done
function
#!/bin/bash
xyz(){
echo "hello function xyz"
}
xyz
hello function xyz
# 向定义的函数传参。位置参数
xyz_with_params(){
echo "函数传递的参数个数为:$#"
for i in `seq 1 $#`
do
echo "第${i}个位置参数为:$1"
shift
done
}
xyz_with_params abc xyz 124
使用shift参数向前移动,打印结果为
[root@master project]# sh func.sh
函数传递的参数个数为:3
第1个位置参数为:xxx
第2个位置参数为:yyy
第3个位置参数为:zzz
带返回值
# 函数里的返回值
xyz_with_return(){
echo "函数返回值为1000"
return 1000
}
xyz_with_return
echo "函数返回值为:$?"
函数返回值为1000
# 函数返回值介意0~255
函数返回值为:232
可以与if/else绑定
if xyz_with_return
then
echo "函数执行成功"
else
echo "函数执行失败"
fi
此处由于函数返回的$?!=0,执行else中的逻辑
"函数执行失败"
compute计算
#!/bin/bash
a=`expr 2 + 3`
echo $a
运行结果: 5
b=`expr $a+10`
echo "$a + 10= $b"
5 + 10 = 15
c=`expr $a\* 10`
echo "$a * 10=$c"
5 * 10 = 50
d=`expr $c / 3`
echo "$c / 3= $d"
50 / 3 = 16
e=`expr $c % 3`
echo "$c % 3= $e"
50 % 3= 2
let
let "a+=10"
echo "a+10=$a"
a+10=15
let "a/=10"
echo "a=$a"
a=1
# 自增操作
let "a++"
echo "a++=$a"
a++=2
var b=67
((b++))
echo "b自增后的值$b"
((b%=10))
echo "取余10后,b的值为$b"
b自增后的值68
取余10后,b的值为8
浮点计算, 需要依赖bc命令
yum -y install bc
# 浮点计算,bc命令,设置scale小数点后的位数
echo "scale=2;1.2*1.1+0.22" | bc
1.54
str字符
#!/bin/bash
var1=xxxxxxxbc123212zy
echo "变量var1的长度${#var1}"
变量var1的长度17
var2="中文字符"
echo "变量var2的长度${#var2}"
变量var2的长度4
# 截取字符串,与py的含义不一样
echo "去掉前面两个字符:${var1:2}"
去掉前面两个字符:xxxxxbc123212zy
# 切片
echo "从第5个字符开始,连续取三个字符:${var1:5:3}"
从下标第5个字符开始,连续取三个字符:xxb
# 删除某个子串 #、##、%、%%分别表示从前面删除、从前面删除到最后一个、从后面删除、从后面删除到第一个
echo "从左边删除最小匹配,结果为:"${var1#x*b}
xxxxxxxbc123212zy
从左边删除最小匹配,结果为:c123212zy
# 只替换第一个的结果
echo "替换bc字符串结果为:${var1/bc/BC}"
替换bc字符串结果为:xxxxxxxBC123212zy
# 替换全部的结果
echo "替换所有的x字符串结果为: ${var1//x/X}"
替换所有的x字符串结果为: XXXXXXXbc123212zy
echo "从头开始匹配替换,结果为:${var1/#xxx/你好}"
从头开始匹配替换,结果为:你好xxxxbc123212zy
echo "从尾部开始匹配替换,结果为:${var1/%zy/你好}"
从尾部开始匹配替换,结果为:xxxxxxxbc123212你好
echo "变量var3的值:${var3-xyz}"
变量var3的值:xyz
echo "变量var3的值:${var3:-xyz}"
变量var3的值:xyz
两种赋默认值的区别是
var3=
echo "变量var3的值:${var3-xyz}"
输出变量var3的值:
var3=
echo "变量var3的值:${var3:-xyz}"
输出变量var3的值:xyz
:xyz, 不管结果是否为空,只要变量定义即输出对应变量值,而:-abc只要变量为空,就会设置默认值
var4=123
#只有变量var4赋值后,默认值生效.如果var4定义为空,也会生效
echo "变量var4的值:${var4+xyz}"
echo "变量var4的值:${var4:+xyz}"
var5=
# 问号后面跟错误信息,如果var5没有定义,则报错退出,并提示定义的错误信息
echo "变量var5的值:${var5?"请输出var5的变量值"}"
[root@master project]# var5=
[root@master project]# echo "变量var5的值:${var5?"请输出var5的变量值"}"
变量var5的值:
[root@master project]# echo "变量var6的值:"${var6:?"请输入var的变量值"}
-bash: var6: 请输入var的变量值

浙公网安备 33010602011771号