shell脚本

本文详细介绍了Linuxshell中的快捷键使用、变量的赋值、运算、文件操作、逻辑控制(如if-else、while循环)、预定义和自定义变量以及特殊符号的用法,为Shell初学者和高级用户提供了实用技巧。
摘要由CSDN通过智能技术生成

shell快捷键

^R:调出历史命令
^D:退出
^A:光标移动到命令最前面
^E:光标移动到命令最后面
^k:删除光标后的字符
^U:删除光标前的字符
^S:锁屏
^Q:解锁屏幕
^Y:撤销

shell版本

存放在/etc/shells文件中,查看Linux默认shellecho $shell

变量

作用范围:仅仅在当前shell起作用

语法: 变量名=变量值

varname=varValue;

变量的赋值

  1. 直接赋值

    a=3

  2. 从键盘中读入赋值

    read -p "input ip:" ip

    read命令被用来从标准输入读取单行数据

  3. 使用命令行参数赋值

    cat	test.sh
    
    echo	$1	$2
    
    chmod 	a+x	test.sh
    
    ./test.sh	test1	test2
    
    test1	test2
    
  4. 利用命令的输出结果赋值

cmd='date +%F'
echo $cmd
  1. 从文件中读入数据赋值

    vim line.sh
    #!/bin/bash
    ls *.sh >execfile
    while read line
    do
    	echo $line
    done<execfile
    

shell变量的运算

在Linux的shell中,变量值的类型默认是字符串,不能进行直接运算,如果需要对shell变量进行运算,需要使用特殊方法.shell中用于整数运算的方法有expr、(())和¥[].shell也可以对小数进行运算

expr数值运算命令
num1=10
num2=20
expr $name1 + $name2		#30
expr 2 \* 2				#4

在使用expr命令时,运算符及用于计算的数字两边必须有空格,否则会执行失败.另外,expr也支持乘法运算,在使用乘法运算时,必须用反斜杠转义,因为shell可以将其误解为*号

(())或[]数值运算命令
num1=10
num2=20
sum=$(($num1+$num2))
echo $sum					#30
echo sum=$[$sum1+$sum2]		#30

let数值运算命令

let数值符合可以直接进行运算,且不带回显功能,也就是说当使用let的时候,不再使用$引用变量.let运算命令的语法格式为:let赋值表达式,其功能等同于"((赋值表达式))"

sum=2
sum=sum+8
echo $sum			#sum+8
unset sum			#取消变量
sum=2
let sum=sum+8
echo $sum			#10

shell小数运算

bc是unix/linux下的计算器.它还可以作为命令进行小数运算,用于交互和非交互,但一般用的较少

echo "2 \* 2" | bc

shell变量的删除、替换和替代

获取变量长度:${#var}
索引:${url:4:5}
shell变量的删除
格式说明
${变量名#关键字符}如果变量内容从头开始的数据符合"关键字符",则将符合的最短数据删除
${变量名##关键字符}如果变量内容从头开始的数据符合"关键字符",则将符合的最长数据删除
${变量名%关键字符}如果变量内容从尾开始的数据符合"关键字符",则将符合的最短数据删除
${变量名%%关键字符}如果变量内容从尾开始的数据符合"关键字符",则将符合的最长数据删除
#实例
file=/dir1/dir2/dir3/my.file.txt		#定义file变量
echo $file								#显示file变量
echo ${file#*/}							#最短匹配,删除/和/左边的字符串
#结果 dir1/dir2/dir3/my.file.txt
echo ${file##*/}						#最长匹配,删除/和/左边的字符串
#结果 my.file.txt
echo ${file%/*}							#最短匹配,删除/和/右边的字符串
#结果 /dir1/dir2/dir3
echo ${file%%/*}						#最长匹配,删除/和/右边的字符串
#结果为空
shell变量的替换
格式说明
${变量名/旧字符串/新字符串}若变量内容符合旧字符串,则第一个’旧字符串’会被’新字符串’替换
${变量名//旧字符串/新字符串}若变量内容符合旧字符串,则全部’旧字符串’会被’新字符串’替换
#实例
var=www.baidu.com
echo ${var/baidu/qfedu}				#将baidu替换为qfedu
#结果	www.qfedu.com
var=www.sina.com.cn
echo ${var//n/N}					#将n替换为N
#结果 www.siNa.com.cN
shell变量的替代

给shell变量设置默认值的格式为${name-new value},如果变量名没有被赋值,则会使用"新的变量值",如果变量已被赋值(包括空值),则该值不会被替代.

#示例
unset port					#取消变量port
echo ${port-3306}			#此时port没有被赋值,则使用3306
#结果 3306
port=3307
echo ${port-3306}
结果 3307 				   #此时变量已被赋值,则不会使用3306

${name:-new value}变量没有赋值(包括空值)都会使用新值,变量有被赋值:不会被替代

shell变量的自增

shell变量的自增运算符是i++,++i.i++表示先赋值再运算,++i表示先运算再复制

#i++和++i对变量的影响
i=1
let i++
echo $i
#结果 2
j=1
let ++j
echo $j
#结果 2
#可以看出,不管先赋值再自加还是先自加再赋值,其结果都是一样的

##i++和++i对表达式的影响
unset i
unset j
i=1
j=1
let x=i++
let y=++i
echo $i
#结果 2
echo $j
#结果 2
echo $x
#结果 1
echo $y
#结果 2
#可以看出,不管先赋值再自加还是先自加再赋值,表达式结果是不一样的

shell变量中的特殊符号

#表示注释 行首为#(#!是个例外)表示此行是注释

# Network information

#注释也可以放在本行命令的后面,需要注意的是#两边有空格
echo " A comment will follow." # 

#注释也可以放在本行行首空白的后面
# A tab precedes this comment.

;在同一行中分隔两个或以上的命令

echo hello;echo there

;也适用于循环语句

#实例
#!/bin/bash
if [ -x "$filename" ]; then
	echo "File $filename exists.";cp $filename $filename.back
else
	echo "File $filename not found.";touch $filename
fi

;;用于终止case选项

#!/bin/bash
case "$variable" in
abc)
	echo "/variable = abc"
	;;
xyz)
	echo "/variable = xyz"
	;;
esac

.等价于source命令.

:空命令和true命令作用相同

:
echo $?				#上条命令执行成功,返回值为0
#结果 0

#在while死循环和if/then中也可以使用这个命令
while:
do
	operation1
	operation2
done

while:
do
	operation1
	operation2
done

if 条件
then : #什么也不做,引出分支
else
	action
fi

#反引号命令被调用时,可以使用冒号
: $[username `whoami`]
# $[username= `whoami`]

$表示变量替换或引用变量的内容

var1=68
var2=test
echo $var1 $var2
#结果 68 test

预定义变量

$?:判断上一个命令的执行结果,结果为true,返回0,结果为false,返回1

$$:当前进程的PID

$!:上一个后台进程的PID

$#:参数的个数

$@:所有的参数

$*:所有的参数

$0:脚本名

位置变量

#例
[root@bogon shell]# cat ping01.sh 
#!/usr/bin/bash
ping -c1 $1 &> /dev/null
if [ $? -eq 0 ]; then
        echo "$1 is up"
else
        echo "$1 is down"
fi

[root@bogon shell]#./ping01.sh www.baidu.com
#输出结果www.baidu.com is up

自定义变量

ip=www.baidu.com

强引用与弱引用

" " : 弱引用

name="test"
out="$name"
#结果
test

’ ’ : 强引用

name="test"
out='$name'
#结果
$name

``命令替换 等价于$()

    touch `date +%F`_file1.txt && \
    touch $(date +%F)_file2.txt
    #结果
    2023-02-08_file1.txt  2023-02-08_file2.txt

&&与||

&&
当前面的命令执行成功后,执行后面的命令
|| 前面的命令执行失败后,执行后面的命令
#例
cat /etc/passwd && echo $? || echo "Fiedler"
当cat /etc/passwd执行成功,返回值为0执行echo $?,执行失败执行echo "Fiedler"

read用法

read : 从键盘读入内容

-p:打印字符串(提示信息)

-t:等待的时间

-n:字符数量

if语句

以if开始,fi结束

参数:

-f:判断是否是文件

for循环

for i in {1..5}
do
	
	
done

while循环

i=1
while [ $i -le 5 ]
do
	echo "..."
	let i++
done
  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值