shell 脚本语言简单使用
shell 作为linux 脚本语言,对于我们学习他人程序流程以及方便自身开发都有很大帮助,值得学习。
顶行
#! /bin/bash
#!/bin/sh是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。
简单使用
hello-world
永远的开始——hello-world,这里echo用来返回。
echo "Hello world \n"
返回参数
echo ${0} # 返回执行文件
echo ${1} # 返回输入的第一个参数
echo ${2} # 返回输入的第二个参数
echo ${3} # .
echo ${4} # .
echo ${5} # .
echo ${*} # 返回所有参数
echo ${#} # 返回参数个数
#执行结果
root@chilewang-Lenovo:~# sh ss.sh 1 2 3 4 5
ss.sh
1
2
3
4
5
1 2 3 4 5
5
引入其他脚本文件
这里可能会报错。
. include.sh
# 或者
source include.sh
定义字符串变量
这里注意变量赋值“=”左右两端不能有空格。基本上shell中赋值都不可加空格。
str=sdfghh
定义只读字符串
readonly str
一些规则
"" # 可以识别变量,但无法存放 $ ` \ "" 可以使用转义符
'' # 不解析字符,所有字符都认为普通字符,不解析变量
\ # 转义
长度计算 ${#变量}
${#str}
子串提取
从字符串第二个字符,提取三个字符
${str:2:3}
数组操作
数组定义及取值
array=(a b c d)
echo ${array[0]}
echo ${array[1]}
字符串的计算
-lt #小于
-le #小于等于
-gt : #大于
-ge : #大于等于
-eq : #等于
-nq : #不等于
文件的判断
-f # 普通文件
-d # 目录文件
-w # 文件可写
-x # 文件可执行
-s # 文件至少有一个字符
-c # 字符设备文件——比如鼠标键盘
-b # 块设备文件
测试工具:test
test # 测试工具,成功的值 $? 表现为0,否则为1。
注意判断逻辑仍为正确和错误
[ 表达式 ] # 简写形式:表达式前后需要空格
逻辑判断
-a # 逻辑与,and的简写。
&&
-o # 逻辑或,or简写
||
! # 逻辑非,
结构书写
if 分支结构
简单判断,其中if 做起手,fi 做结束。
if [ 2 -lt 3 ];then
echo "2 < 3"
fi
#返回值
2 < 3
if——else:
其中read -p 是读取输入值 最后存入ch
read -p "input a char:" ch
if [ $ch -ge 5 ];then
echo ">=5"
elif [ $ch -ge 3 ];then
echo ">=3"
else
echo "<3"
fi
# 执行结果:
input a char:1
<3
case 分支结构
这里注意判断[]的空格问题,这里没有空格
read -p "input a char:" ch
case $ch in
[a-z])
echo "alpha"
;;
[0-9])
echo "number"
;;
*)
echo "others"
;;
esac
# 输出结果:
root@chilewang-Lenovo:~# sh case.sh
input a char:a
alpha
root@chilewang-Lenovo:~# sh case.sh
input a char:3
number
for 循环结构
简单遍历
for x in a b c
do
echo $x
done
# 执行结果
root@chilewang-Lenovo:~# sh for.sh
a
b
c
遍历目录
for x in /*
do
echo $x
done
# 执行结果:
root@chilewang-Lenovo:~# sh for.sh
/'
/1
/bin
/boot
···
遍历数字:
for x in `seq 0 10`
do
echo $x
done
# 执行结果:
root@chilewang-Lenovo:~# sh for.sh
0
1
2
3
4
5
6
7
8
9
10
累加:
for x in `seq 0 10`
do
let sum+=$x
done
echo $sum
# 结果:
55
for 语句的传统写法:
for ((i=0;i<=10;i++))
do
echo $i
done
while 循环结构
i=1
while [ $i -le 10 ]
do
echo $i
i=$[$i+1]
#((i++))
# 或用
# let i+=1
done
until 循环结构
i=1
until [ $i -gt 10 ]
do
echo $i
((i++))
done
# 执行结果:
1
2
3
4
5
6
7
8
9
10
break 循环结构
这里注意 while与 : 之间的空格。
这里的冒号命令 相当于true,放在while后面,表示无限循环
while :
do
read -p "input a char:" ch
case $ch in
#1|3|5) # 这里可以间断的判断值的取值
[1-5]) # 这里连续判断取值
echo "ok"
;;
*)
echo "error"
break
;;
esac
done
# 执行结果:
input a char:1
ok
input a char:6
error
continue 循环结构
在 [] 内运算之后的值进行判断时,需要使用$[] 对其取值再做判断。
同时注意if语句的 fi 结束符号。
i=1
while [ $i -le 10 ]
do
if [ $[$i%3] -eq 0 ];then
((i++))
continue
fi
echo $i
((i++))
done
# 执行结果:
1
2
4
5
7
8
10
函数书写
hello world
demo()
{
echo "hello world"
}
demo
# 执行结果:
hello world
回调参数
test()
{
echo $1
echo $2
}
test 123 abc
# 执行结果:
123
abc
函数返回值与接收
add()
{
return 123
}
add
echo $?
# 执行结果:
123
逻辑运算
判断与
如果2小于3 且 3小于5,输出。
if [ 2 -lt 3 -a 3 -lt 5 ];then
# 还可以这样写
# if [ 2 -lt 3 ] && [ 3 -lt 5 ];then
echo "ok!"
fi
# 输出结果:
ok!
判断或
if [ 2 -gt 3 -o 3 -lt 5 ];then
# if [ 2 -gt 3 ] || [ 3 -lt 5 ];then
echo "ok!"
fi
# 输出结果:
ok!
取反
if [ ! 2 -gt 3 ];then
echo "ok!"
fi
# 执行结果:
ok!
黑洞文件
该文件如何写入都是空,任意时间读取都是空。
用于清空文件,该文件在/dev/null。
将黑洞文件重定向到1.txt,即可清空文件。
cat /dev/null > 1.txt
还可以清空命令
cat /dev/null >
printf与字符串的拼接
printf "hello %s\n" "world"
printf "hello %d %s \n" 123 "world"
# 输出结果:
hello world
hello 123 world
sed 文件流处理
作用:处理文件流
格式:sed [参数] 指令 文件
参数:
-n:结合命令p使用,用于打印(并没有改变内容)。
-i:默认不加 改 参数不会修改文件内容,加上会修改
用于查找
# 打印sed.sh文件第一行
sed -n '1p' sed.sh
# 打印第三行
sed -n '3p' sed.sh
# 打印最后一行
sed -n '$p' sed.sh
# 打印某个范围
sed -n '3,5p' sed.sh
sed -n '3,$p' sed.sh
用于添加
注意:没有添加 -i 参数,仍然未修改文件内容。
# 在第一行后面添加xxx
sed '1a xxx' sed.sh
# 在第1到第三行后面添加xxx
sed '1,3a xxx' sed.sh
用于删除
# 删除第五行
sed '5d' sed.sh
# 删除第一到5行
sed '1,5d' sed.sh
用于取代
# 取代第三行
sed '3c xxx' sed.sh
# 取代第三到五行
sed '3,5c xxx' sed.sh
用于替换
# s 用于替换,查找ia,并用xxx替换,/g全局。
sed 's/ia/xxx/g' sed.sh
# 在5到6行进行操作。
sed '5,6s/ia/xxx/g' sed.sh
常用操作
管道(|)
说明:将前一个命令的输出作为后一个命令的输入。
# 作为more的参数输入
ls -l /etc/ | more
# 打印包含 vi 的
ls -l /etc/ | grep vi
# 执行结果:
-rw-r--r-- 1 root root 96 9月 30 2019 environment
-rw-r--r-- 1 root root 19183 12月 26 2016 services
drwxr-xr-x 2 root root 4096 10月 13 2019 vim
# 打印vi开头的
ls -l /etc/ | grep '^vi'
假如有些命令不接受参数,添加
find -type d | xargs rm -r
重定向 (>)
打开任意程序,系统自动创建三个文件流:标准输入(0),标准输出(1),标准错误(2),而且这三个文件都被指向到了终端。
我们可以使用 > 输出到文件中
输出重定向:
root@chilewang-Lenovo:~# echo 1 > 1.txt
root@chilewang-Lenovo:~# cat 1.txt
1
# 使用>> 进行追加
root@chilewang-Lenovo:~# echo 1 >> 1.txt
root@chilewang-Lenovo:~# cat 1.txt
1
1
错误重定向:
注意这里的 “2>1”不能有空格
root@chilewang-Lenovo:~# ls /abc 2>1.txt
root@chilewang-Lenovo:~# cat 1.txt
ls: 无法访问'/abc': 没有那个文件或目录
将多个输出同时定向到一个文件:
root@chilewang-Lenovo:~# ls /abc . &>1.txt
root@chilewang-Lenovo:~# cat 1.txt
ls: 无法访问'/abc': 没有那个文件或目录
.:
1
1.sh
1.txt
break.sh
本文介绍Shell脚本的基础知识,包括shell脚本的执行原理、基本语法、变量定义、字符串操作、流程控制结构如if、for、while循环,以及函数定义等。通过实例演示了常见操作如条件判断、循环迭代、文件读写等。
32万+

被折叠的 条评论
为什么被折叠?



