shell学习笔记
shell是运维人员的最基本一门编程语言。
shell的基本涵括:变量(局部变量 全局变量 环境变量) 函数(function) if函数 for循环 while循环 运算 awk sed
变量:
变量的命名
aa=hello 这里的命名,如果没有特殊符号(下划线,括号,键盘上的F键的符号等),都可以不加任何符号直接写在等号后面的
aa='hello' 加了单引号,原意是原样输出,在这里做变量,没有特殊符号,这样做没什么毛病。
aa="hello" 双引号,在shell中,如果要显示变量的,就必须使用双引号。
aa=$(ls -l /root;cat /etc/passwd) 在使用变量中,有时候我们需要用到的变量是执行一个命令或者几个命令,这个时候就需要用到 $() 或者等价于 反引号 `` ,在这个过程中,如果有多个命名就要用 ; 比如 aa=$(less /etc/group;df -h;top;nload)
函数(function)
function look(){
cat /etc/passwd
}
#########调用函数######
look
##### 调用函数结束#############
变量值的传递--------------------一个变量的结果赋值给另外一个变量
begin_time=`date`
finish_time=$(date)
在这里date使用两遍,我们要的结果就是显示开始时间和结束时间。
统计字符串的长度
string ${#string} 比如 echo ${$yanzi}
shell字符串拼接
- #!/bin/bash
- name="Shell"
- url="http://c.biancheng.net/shell/"
- str1=$name$url #中间不能有空格
- str2="$name $url" #如果被双引号包围,那么中间可以有空格
- str3=$name": "$url #中间可以出现别的字符串
- str4="$name: $url" #这样写也可以
- str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号
- echo $str1
- echo $str2
- echo $str3
- echo $str4
- echo $str5
运行结果:
Shellhttp://c.biancheng.net/shell/
Shell http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
Shell: http://c.biancheng.net/shell/
ShellScript: http://c.biancheng.net/shell/index.html
字符串截取
1. 从左边截取
${string: start :length}
比如:
- url="c.biancheng.net"
- echo ${url: 2: 9}
2.从右边截取
${string: 0-start :length}
比如:
- url="c.biancheng.net"
- echo ${url: 0-13: 9}
使用#截取右边的字符
${string#*chars}
比如:
- url="http://c.biancheng.net/index.html"
- echo ${url#*:}
结果为//c.biancheng.net/index.html
格式 | 说明 |
---|---|
${string: start :length} | 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。 |
${string: start} | 从 string 字符串的左边第 start 个字符开始截取,直到最后。 |
${string: 0-start :length} | 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。 |
${string: 0-start} | 从 string 字符串的右边第 start 个字符开始截取,直到最后。 |
${string#*chars} | 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。 |
${string##*chars} | 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。 |
${string%*chars} | 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。 |
${string%%*chars} | 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。 |
shell计算
expr 格式 : expr 6 + 9
bc 是shell一个内置计算器
直接输入 bc
variable=$("9+6"|bc)
shell判断
if else
格式:
if condition; then
statement(s)
fi
例如:
#!/bin/bash
read a
read b
if (( $a == $b ))
then
echo "a和b相等"
fi
说明: (())
是一种数学计算命令,它除了可以进行最基本的加减乘除运算,还可以进行大于、小于、等于等关系运算,以及与、或、非逻辑运算。当 a 和 b 相等时,(( $a == $b ))
判断条件成立,进入 if,执行 then 后边的 echo 语句
if elif else 这种if判断主要用于有多个分支的情况下,使用这种格式。
if condition1
then
statement1
elif condition2
then
statement2
elif condition3
then
statement3
……
else
statementn
fi
例如:
#!/bin/bash
read age
if (( $age <= 2 )); then
echo "婴儿"
elif (( $age >= 3 && $age <= 8 )); then
echo "幼儿"
elif (( $age >= 9 && $age <= 17 )); then
echo "少年"
elif (( $age >= 18 && $age <=25 )); then
echo "成年"
elif (( $age >= 26 && $age <= 40 )); then
echo "青年"
elif (( $age >= 41 && $age <= 60 )); then
echo "中年"
else
echo "老年"
fi
Shell [[]]详解:检测某个条件是否成立
test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;test 做不到的,[[ ]] 还能做到。可以认为 [[ ]] 是 test 的升级版,对细节进行了优化,并且扩展了一些功能。
例如:
#!/bin/bash
read str1
read str2
if [[ -z $str1 ]] || [[ -z $str2 ]] #不需要对变量名加双引号
then
echo "字符串不能为空"
elif [[ $str1 < $str2 ]] #不需要也不能对 < 进行转义
then
echo "str1 < str2"
else
echo "str1 >= str2"
fi
case in 语句
#!/bin/bash
printf "Input integer number: "
read num
case $num in
1)
echo "Monday"
;;
2)
echo "Tuesday"
;;
3)
echo "Wednesday"
;;
4)
echo "Thursday"
;;
5)
echo "Friday"
;;
6)
echo "Saturday"
;;
7)
echo "Sunday"
;;
*)
echo "error"
esac
Shell while 循环的用法如下:
while condition
do
statements
done
例子:
#!/bin/bash
i=1
sum=0
while ((i <= 100))
do
((sum += i))
((i++))
done
echo "The sum is: $sum"
unti 循环和 while 循环恰好相反,当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环。
until condition
do
statements
done
例如:
#!/bin/bash
i=1
sum=0
until ((i > 100))
do
((sum += i))
((i++))
done
echo "The sum is: $sum"
for循环
for((exp1; exp2; exp3))
do
statements
done
例子:
#!/bin/bash
sum=0
for ((i=1; i<=100; i++))
do
((sum += i))
done
echo "The sum is: $sum"
select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功能。
Shell select in 循环的用法如下:
select variable in value_list
do
statements
done
例如:
#!/bin/bash
echo "What is your favourite OS?"
select name in "Linux" "Windows" "Mac OS" "UNIX" "Android"
do
echo $name
done
echo "You have selected $name"