Shell

Shell

Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理, Shell 将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。

编写sheel脚本

# 创建sheel文件
vim test.sh # 文件后缀非固定
# 添加代码
#!/bin/bash
echo 'test'
# 保存退出运行脚本
# 通过解释器执行
/bin/sh test.sh
# 添加可执行权限作为脚本执行
chmod +x ./test.sh
./test.sh

变量

命名规则

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

定义变量

name="张三"

使用变量

echo $name
echo ${name} # {}用来识别变量边界

定义常量

name="张三"
readonly name

删除变量

unset name

read
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

read name 

数据类型

字符串

字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。

name=张三
name='张三'
name="张三"

单引号中的字符均会原样输出,其中引用变量是无效的,并且无法使用转义符转义,双引号内可以使用变量,并且可以使用转义符

字符串拼接

name="张三"
new_name="hello${name}!"
new_name="hello"${name}"!"

获取字符串长度

name="张三"
echo ${#name}

截取字符串

name="泷泽萝拉哒"
echo ${name:1:4}

查找字符串位置

name="泷泽萝拉哒"
echo `expr index "$name" 哒`

数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。

list1=(1 2 3 4 5)
list2=(
1
2
3
4
5
)

读取数组

echo ${list1[1]}
echo ${list1[@]} # @表示所有元素

获取数组长度

echo ${#list1[*]}
echo ${#list1[@]}
echo ${#list1[1]} # 获取单个元素的长度

注释

shell的单行注释以#标识

# list1=(1 2 3 4 5)
# echo ${#list1[*]}

多行注释

:<<EOF
list1=(1 2 3 4 5)
list2=(1 2 3 4 5)
EOF

:<<'
list1=(1 2 3 4 5)
list2=(1 2 3 4 5)
'

:<<!
list1=(1 2 3 4 5)
list2=(1 2 3 4 5)
!

参数传递

在执行脚本时向脚本内传递参数,类似执行函数时对函数进行传参那样

在脚本内部写入标记,注意在运行脚本时第一个参数是脚本名本身

echo "执行的文件名:$0";
echo "参数1:$1"
echo "参数2:$2"

执行脚本时写入参数

$ ./test.sh 1 2
参数说明
$#传递参数的个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数
$-显示Shell使用的当前选项,与set命令功能相同
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

算数运算符

val=`expr 10 + 1`
val=`expr 10 - 1`
val=`expr 10 * 1`
val=`expr 10 / 1`
val=`expr 10 % 1`
# 条件表达式要放在方括号之间,并且要有空格	
if [ $a == $b ]
if [ $a != $b ]

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

if [ $a -eq $b ] #判断是否相等
if [ $a -ne $b ] #判断是否不相等
if [ $a -gt $b ] #判断左边是否大于右边
if [ $a -lt $b ] #判断左边是否小于右边
if [ $a -ge $b ] #判断左边是否大于等于右边
if [ $a -le $b ] #判断左边是否小于等于右边
 

布尔运算符

if [ $a != $b ] #非
if [ $a -lt 20 -o $b -gt 100 ] #或
if [ $a -lt 20 -a $b -gt 100 ] #与

逻辑运算符

if [[ $a -lt 100 && $b -gt 100 ]] #与
if [[ $a -lt 100 || $b -gt 100 ]] #或

字符串运算符

if [ $a = $b ] #判断字符串是否相等
if [ $a != $b ] #判断字符串是否不相等
if [ -z$a ] #判断字符串长度是否为0
if [ -n$a ] #判断字符串长度是否不为0
if [ $a ] #判断字符串是否为空,不为空返回 true。

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false。
-p file检测文件是否是有名管道,如果是,则返回 true。[ -p $file ] 返回 false。
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
-r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
-w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true。

echo

echo用于字符串的输出

echo $name #输出变量
echo "\"hello\"" #转义
echo "hello" #输出字符串
echo -e "hello \n" #换行,-e开启转义
echo -e "hello \c" #不换行,-e开启转义
echo "hello" > file #输出结果为文件

printf

printf "Hello\n"
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234  
#-10s表示左对齐宽度10个字符
#%s %c %d %f都是格式替代符
#%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
#%-4.2f 指格式化为小数,其中.2指保留2位小数。
printf "%d %s\n" 1 "abc
# 1 abc
转义序列说明
\a警告字符,通常为ASCII的BEL字符
\b后退
\c抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f换页(formfeed)
\n换行
\r回车(Carriage return)
\t水平制表符
\v垂直制表符
\一个字面上的反斜杠字符
\ddd表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd表示1到3位的八进制值字符

test

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

num1=1
num2=2
if test $[num1] -eq $[num2]
var1='abc'
var2='aaa'
if test $var1= $var2 

流程控制

shell的流程控制不可为空

if

if condition
then
    command1 
    command2
    ...
    commandN 
fi

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

if else

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

for 循环

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

for var in item1 item2 ... itemN; do command1; command2… done;

while

while condition
do
    command
done

until

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

until condition
do
    command
done

case
Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

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

break

跳出循环

continue

跳出当前循环进入下次循环

函数

定义函数

func(){
    echo "fun1"
    return "fun1"
}

func #调用函数
echo "函数返回结果为$? !" #通过$?获取函数返回结果

参数

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
参数处理说明
$#传递到脚本或函数的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值