当前位置: 首页> 健康> 母婴 > Linux Shell编程--脚本运行与变量置换

Linux Shell编程--脚本运行与变量置换

时间:2025/7/20 21:23:16来源:https://blog.csdn.net/lerp020321/article/details/141017606 浏览次数:0次

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除

一、脚本运行

1、创建Bash脚本(Shell脚本)

1、创建脚本文件

 # !/bin/bash 指定命令解释器 # 注释 编写bash指令集合 (脚本内容) 

2、修改权限

2、bash/sh 脚本的绝对路径/相对路径

不管脚本有没有x(可执行)权限,都可以执行

2.1、sh脚本的相对路径执行脚本

 [root@centos opt]# vim hello.sh[root@centos opt]# pwd/opt[root@centos opt]# sh hello.sh Hello!

2.2、sh脚本的绝对路径执行脚本

 [root@centos opt]# sh /opt/hello.shHello!

2.3、 bash 脚本的相对路径执行脚本

 [root@centos opt]# bash hello.sh Hello!

2.4、bash 脚本的绝对路径执行脚本

 [root@centos opt]# bash /opt/hello.shHello!

3、脚本的绝对路径/相对路径(需要脚本的+x权限)

3.1、脚本的相对路径执行脚本

 [root@centos opt]# ./hello.sh-bash: ./hello.sh: Permission denied    # 权限不够[root@centos opt]# chmod +x hello.sh[root@centos opt]# ./hello.shHello![root@centos opt]# ll-rwxr-xr-x  1 root root 26 Aug  1 14:11 hello.sh

可以发现,执行./hello.sh需要x权限】、

3.2、脚本的绝对路径执行脚本

收回权限再次使用绝对路径执行脚本

 [root@centos opt]# chmod -x hello.sh[root@centos opt]# /opt/hello.sh-bash: /opt/hello.sh: Permission denied ​# 无权限,给脚本添加权限即可使用绝对路径执行[root@centos opt]# chmod +x hello.sh[root@centos opt]# /opt/hello.shHello!

4、source脚本的绝对路径/相对路径执行脚本

source执行脚本时,不管脚本有没有x(可执行权限),脚本都可以执行 我们平时配置完环境变量,用的就是source执行,如source /etc/profile

5、子shell

 [root@centos ~]# cat bash.shcd /opt/pwd[root@centos ~]# sh bash.sh/opt[root@centos ~]# source bash.sh /opt

6、Bash脚本测试

sh –x script# 这将执行该脚本并显示所有变量的值
sh –n script# 不执行脚本只是检查语法模式,将返回所有错误语法
sh –v script# 执行脚本前把脚本内容显示在屏幕上

二、变量置换

1、命令替换

a=`date +%m%d`
a=$(date +%m%d)
反引号亦可用$() 代替

2、变量替换

(1)${parameter:-word}

若 parameter 为空或未设置,则用 word 代替 parameter 进行替换,parameter 的值不变

# a=1
# unset b
# a=${b:-3} # echo $a
3
# echo $b

若 parameter 不为空,则不替换,parameter 的值不变

# unset b
# a=1
# b=2
# a=${b:-3} # echo $a
2
# echo $b
2

(2) ${parameter:=word}

若 parameter 为空或未设置,则用 word 代替 parameter 进行替换,parameter 的值改变

# a=1
# unset b
# a=${b:=3}
# echo $a
3
# echo $b
3

若 parameter设置了,则 不替换,parameter 的值不变

# a=1
# b=2
# a=${b:=3}
# echo $a
2
# echo $b
2

(3)${parameter:+word}

如果 parameter 已设置,那么 word将被扩展并替换为该表达式的结果;

# a=1
# b=2
# a=${b:+3}
# echo $a
3
# echo $b
2

如果 parameter 未设置或为空,则结果为空

# a=1
# unset b
# a=${b:+3}
# echo $a# echo $b

(4) ${parameter:?message}

若 parameter 为空或未设置,则 message 作为标准错误打印出来,这可用来检查变量是否正确设置

unset a
# ${a:?unset a}
-bash: a: unset a

三、变量替换-匹配截取

${变量#关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最短数据切除
${变量##关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最长数据切除
${变量%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据切除
${变量%%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据切除
${变量/旧字符串/新字符串} 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串替代』
${变量//旧字符串/新字符串} 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串替代』

1、索引及切片

[root@centos ~]# a=12345678
[root@centos ~]# echo ${a:5}		# 从第5位开始截取
678
[root@centos ~]# echo ${a:3:4}	# 从第3位开始截取4位
4567
[root@centos ~]# echo ${a:2:-1}	# 从第2位开始截取到倒数第1位之前(不包括倒数1位)
34567
[root@centos ~]# echo ${a:2:-2}	# 从第2位开始截取到倒数第2位之前(不包括倒数2位)
3456

2、变量内容的删除

[root@centos ~]# url=www.sina.com.cn
[root@centos ~]# echo ${#url}		# 获取变量的长度
15
[root@centos ~]# echo ${url}		# 输出正常值
www.sina.com.cn[root@centos opt]# echo ${url#*.}	# 从前往后,最短匹配
sina.com.cn
[root@centos ~]#  echo ${url##*.}	# 从前往后,最长匹配
cn
[root@centos ~]# echo ${url%.*}		# 从后往前,最短匹配
www.sina.com
[root@centos ~]# echo ${url%%.*}	# 从后往前,最长匹配
www
[root@centos ~]# echo ${url#a.}		# 删除url变量值中最短的以a.结尾的前缀
www.sina.com.cn
# 删除url变量值中最短的以a.结尾的前缀,并且*表示匹配任意数量的字符
[root@centos ~]# echo ${url#*a.}	
com.cn

3、变量内容的替换

[root@centos ~]# a=123456123789
[root@centos ~]# echo ${a/1/}	# 在变量 a 的值中替换第一次出现的 1 为一个空字符串
23456123789		
[root@centos ~]# echo ${a//1/}	# 将变量 a 中所有的 1 替换为空字符串
2345623789		
[root@centos ~]# echo ${a/1/x}	# 将变量 a 值中第一次出现的 1 替换为 x
x23456123789
[root@centos ~]# echo ${a//1/x}	# 将变量 a 值中所有的 1 替换为 x
x23456x23789[root@centos ~]# file=/dir1/dir2/dir3/my.file.txt
[root@centos ~]# echo ${file#*/}	# 去掉匹配到第一个/之前的所有字符串
dir1/dir2/dir3/my.file.txt
[root@centos ~]# echo ${file#*.}	# 去掉匹配到第一个.之前的所有字符串
file.txt
[root@centos ~]# echo ${file##*.}	# 去掉匹配到最后一个.之前的所有字符串
txt
[root@centos ~]# echo ${file%/*}	# 去掉从末尾往前匹配第一个/之间的所有字符串
/dir1/dir2/dir3
[root@centos ~]# echo ${file%.*}	# 去掉从末尾往前匹配第一个.之间的所有字符串
/dir1/dir2/dir3/my.file

记忆的方法为:

# 是去掉左边
% 是去掉右边
单一符号是最小匹配;两个符号是最大匹配(贪婪匹配)。

4、basename & dirname

4.1、basename命令

去除目录后剩下的名字

# 不会检测文件系统,只是取路径的最后一段,将他截取出来
例:
# temp=/home/temp/1.test
# base=`basename $temp`
# echo $base
结果为:1.test

4.2、dirname命令

去除文件的文件名,留目录名

# 不会检测文件系统,默认路径的最后一段为文件名,把它删除
例:
#temp=/home/temp/1.test
#dir=`dirname $temp`
#echo $dir
结果为:/home/temp

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

学习永无止境,让我们共同进步!!

关键字:Linux Shell编程--脚本运行与变量置换

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: