sh 脚本
linux sh 传参数
在Linux中,Shell脚本可以通过命令行参数接收用户输入。
这些参数可以在脚本中被访问和利用。
以下是Shell脚本接收参数的基本方法:
1.位置参数:在Shell脚本中,位置参数是通过在命令行中按照顺序传递给脚
本的参数。
在脚本中,可以使用特殊变量$1、$2、$3等来访问这些参数。
例如,如果用户运行脚本时传递了三个参数,可以使用$1访问第一个参
数,使用$2访问第二个参数,以此类推。
2.特殊变量$0:这个变量包含了脚本的名称。
3.特殊变量$#:这个变量包含了传递给脚本的参数个数。
4.特殊变量$@和$*:这两个变量都引用了所有传递给脚本的参数,但是它们
在处理参数时的表现方式略有不同。
"$@"将每个参数作为独立的字符串处
理,而"$*"则将所有参数作为单个字符串处理。
5.选项参数:选项参数是以短横线(-)或双短横线(--)开头的特定参数。
选项参数通常用于指定脚本的行为或配置脚本的某些方面。
在Shell脚本
中,可以使用特殊变量$1、$2等来访问选项参数之前的参数,使用特殊变
量$@或$*来访问所有选项参数。
需要注意的是,在Shell脚本中处理命令行参数时,应该始终使用引号将参数括起来,以避免因为参数中包含空格或特殊字符而导致的错误。
此外,还应该注意对选项参数进行适当的验证和错误处理,以确保脚本的健壮性和可靠性。
sh命令用法
sh命令是shell命令解释器,它的用法如下:
1. 运行sh脚本命令:
```bash
./xxx.sh
```
其中,“./”表示当前目录,“xxx.sh”是要运行的脚本文件。
2. 运行sh脚本并赋予执行权限:
```bash
chmod +x xxx.sh
./xxx.sh
```
首先使用“chmod +x xxx.sh”命令赋予脚本执行权限,然后再运行脚本。
3. 运行sh脚本并查看输出:
```bash
./xxx.sh && echo "脚本执行成功"
```
使用“&&”符号连接两个命令,如果第一个命令(即脚本执行)成功,则执行第二个命令(即输出“脚本执行成功”)。
4. 运行sh脚本并逐行跟踪:
```bash
sh -x xxx.sh
```
使用“-x”参数可以逐行跟踪脚本的执行过程。
5. 检查sh脚本语法:
```bash
sh -n xxx.sh
```
使用“-n”参数可以检查脚本语法是否正确。
如果语法正确,则返回0(正常退出),否则返回非零值(异常退出)。
这些是sh命令的一些基本用法,当然还有其他用法和参数,具体使用方法可以参考相关文档或手册。
sh 参数传递
sh 参数传递在Linux系统中,sh是一个常用的命令行解释器,用于执行Shell 脚本。
通过传递参数给sh命令,可以实现对脚本的定制化操作。
本文将介绍如何使用sh参数传递来实现不同的功能。
一、基本概念在Shell脚本中,通过$1、$2、$3等特殊变量来获取传递给脚本的参数。
其中,$1表示第一个参数,$2表示第二个参数,依此类推。
通过这些特殊变量,可以在脚本中根据不同的参数来执行不同的操作。
二、参数传递的基本用法1. 单个参数传递当只需要传递一个参数给脚本时,可以直接在sh命令后面跟上参数。
例如,执行以下命令:```sh script.sh arg1```在script.sh脚本中,可以通过$1来获取参数arg1的值。
2. 多个参数传递当需要传递多个参数给脚本时,可以在sh命令后面跟上多个参数,用空格分隔。
例如,执行以下命令:```sh script.sh arg1 arg2 arg3```在script.sh脚本中,可以通过$1、$2、$3来分别获取参数arg1、arg2、arg3的值。
三、参数传递的高级用法1. 参数个数判断在脚本中,可以使用特殊变量$#来获取传递给脚本的参数个数。
通过判断参数个数,可以实现不同的逻辑。
例如,执行以下命令:```sh script.sh arg1 arg2```在script.sh脚本中,可以使用$#来获取参数个数,并根据参数个数的不同执行不同的操作。
2. 参数判空在脚本中,可以使用特殊变量$1、$2等来获取参数的值,并使用条件语句来判断参数是否为空。
例如,执行以下命令:```sh script.sh arg1```在script.sh脚本中,可以使用条件语句判断$1是否为空,并根据判断结果执行相应的操作。
3. 参数默认值在脚本中,可以使用条件语句来判断参数是否为空,如果为空则使用默认值。
例如,执行以下命令:```sh script.sh arg1```在script.sh脚本中,可以使用条件语句判断$1是否为空,如果为空则使用默认值进行操作。
shell中sh和bash的区别
shell中sh和bash的区别在shell脚本的开头往往有⼀句话来定义使⽤哪种sh解释器来解释脚本。
⽬前研发送测的shell脚本中主要有以下两种⽅式:(1) #!/bin/sh(2) #!/bin/bash脚本test.sh内容:#!/bin/shsource pcy.sh #pcy.sh并不存在echo hello执⾏./test.sh,屏幕输出为:./test.sh: line 2: pcy.sh: No such file or directory由此可见,在#!/bin/sh的情况下,source不成功,不会运⾏source后⾯的代码。
修改test.sh脚本的第⼀⾏,变为#!/bin/bash,再次执⾏./test.sh,屏幕输出为:./test.sh: line 2: pcy.sh: No such file or directoryhello由此可见,在#!/bin/bash的情况下,虽然source不成功,但是还是运⾏了source后⾯的echo语句。
但是紧接着我⼜试着运⾏了⼀下sh ./test.sh,这次屏幕输出为:./test.sh: line 2: pcy.sh: No such file or directory表⽰虽然脚本中指定了#!/bin/bash,但是如果使⽤sh ⽅式运⾏,如果source不成功,也不会运⾏source后⾯的代码。
为什么会有这样的区别呢?1. sh⼀般设成bash的软链[work@zjm-testing-app46 cy]$ ll /bin/shlrwxrwxrwx 1 root root 4 Nov 13 2006 /bin/sh -> bash2. 在⼀般的linux系统当中(如redhat),使⽤sh调⽤执⾏脚本相当于打开了bash的POSIX标准模式3. 也就是说 /bin/sh 相当于 /bin/bash --posix所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别so,可以预想的是,如果第⼀⾏写成 #!/bin/bash --posix,那么脚本执⾏效果跟#!/bin/sh是⼀样的(遵循posix的特定规范,有可能就包括这样的规范:“当某⾏代码出错时,不继续往下解释”。
.sh写法
.sh写法
编写.sh脚本文件需要遵循一定的格式和规则。
以下是一个基本的.sh脚本文件
的写法:
1.打开文本编辑器,创建一个新文件,并将其保存为以.sh结尾的文件名,例如script.sh。
2.在文件开头添加一个shebang行,指定要使用的解释器。
例如,要使用Bash解释器,
可以在文件开头添加以下行:
bash
#!/bin/bash
3.在脚本中添加注释。
在Bash脚本中,以#开头的行将被视为注释。
注释用于提供脚
本的描述和说明,方便其他开发人员阅读和理解脚本。
4.编写脚本的逻辑。
在注释之后,开始编写脚本的具体逻辑。
可以根据需要添加命令、
条件语句、循环语句等。
确保合理地使用空格和换行符,以提高代码的可读性。
5.保存并退出文本编辑器。
6.在终端中进入保存脚本的目录。
7.确保脚本具有可执行权限。
使用chmod命令添加可执行权限,例如:
shell
chmod +x script.sh
8.运行脚本。
在终端中输入以下命令来运行脚本:
shell
./script.sh
以上是一个基本的.sh脚本文件的写法。
请注意,具体的写法可能因所使用的Shell 解释器而有所不同。
如果使用其他Shell解释器,请查阅相应的文档以了解正确的写法。
常用的.sh脚本
常⽤的.sh脚本#!/bin/shsource /root/.bash_profilecd /opt/workspace/$1app=$1-appmvn clean compile package -DskipTests -P prdcd $appdocker image rmi softace/$1:1.0.0-SNAPSHOTmvn dockerfile:build -Ddockerfile.build.pullNewerImage=falsedocker images================================================第⼀个export_1.sh#!/bin/shfunction exists(){ec=`docker images |grep $1 |wc -l`if [ "$ec" -eq 1 ];thenecho trueelseecho falsefi}if [ ! -d "./csgl" ];thenecho "mkdir csgl"mkdir -p ./csgl/imagemkdir -p ./csgl/dockerfilefiecho export $1 imagee=$(exists $1)if [ $e = true ];thenimage=`docker images |grep $1 |awk '{print $1":"$2}'`docker save $image -o ./csgl/image/$1.tarfi==================================================================第⼆个export_2.sh#!/bin/shfunction exists(){ec=`docker images |grep $1 |wc -l`if [ "$ec" -eq 1 ];thenecho trueelseecho falsefi}if [ ! -d "./csgl" ];thenecho "mkdir csgl"mkdir -p ./csgl/imagemkdir -p ./csgl/dockerfilefiecho copy $1 dockerfilepath=`find . -name "Dockerfile" |grep -v target|grep -v dockerfile |grep $1`if [ ! -d "./csgl/dockerfile/$1" ];thenmkdir -p "./csgl/dockerfile/$1"ficp $path ./csgl/dockerfile/$1/echo build $1 imagesh /opt/workspace/pack.sh $1echo export $1 imagee=$(exists $1)if [ $e = true ];thenimage=`docker images |grep $1 |awk '{print $1":"$2}'`docker save $image -o ./csgl/image/$1.tarfi==============================================================build.sh--⽤于jenkins持续集成部署#!/bin/shif [ $# != 3 ] && [ $# != 4 ] ;thenecho "usage: build.sh [app name] [port] [job port] [skywalking ip:port]"exit -1fisource /root/.bash_profilecd /opt/workspace/$1app=$1-app#git reset --hard#git pullrm -rf /root/.m2/repository/io/softace/utpsed -i 's/#eureka.instance.ip-address/eureka.instance.ip-address/' $app/src/main/resources/application-dev.propertiesmvn clean compile package -DskipTests -P sitcd $appdocker stop $1docker rm $1docker image rmi softace/$1:1.0.0-SNAPSHOTmvn dockerfile:build -Ddockerfile.build.pullNewerImage=falsedocker imagesif [ $# == 4 ];thendocker run -e SW_AGENT_COLLECTOR_BACKEND_SERVICES=$4 -v /etc/localtime:/etc/localtime -d --name $1 -p $2:$2 -p $3:$3 softace/$1:1.0.0-SNAPSHOTelsedocker run -e SW_AGENT_COLLECTOR_BACKEND_SERVICES=$3 -v /etc/localtime:/etc/localtime -d --name $1 -p $2:$2 softace/$1:1.0.0-SNAPSHOTfidocker psdocker logs $1。
shell -s 用法
shell -s 用法什么是Shell脚本?Shell脚本是一种简化的编程语言,用于自动化执行在操作系统的Shell 环境下运行的一系列命令。
Shell脚本是由一系列命令和控制结构组成的文字文件,它可以被操作系统解释器逐行执行。
Shell脚本可以用于快速、高效地执行复杂的任务,如自动备份文件、批量处理数据等。
Shell脚本的用途Shell脚本可以用于多种用途,例如:1. 系统管理:管理员可以使用Shell脚本来配置和管理操作系统,例如安装软件包、定时任务调度等。
2. 数据处理:Shell脚本可以用于批量处理大量数据,例如日志分析、数据格式转换等。
3. 自动化任务:Shell脚本可以用于自动执行常见的任务,例如备份文件、发送电子邮件等。
4. 工作流程管理:Shell脚本可以用于连接多个命令和程序,形成复杂的工作流程,例如数据流处理、任务调度等。
Shell脚本的基本语法和用法Shell脚本的基本语法包括注释、变量、常量、条件判断、循环和函数等。
下面逐步介绍Shell脚本的用法:1. 注释:Shell脚本中的注释以"#"开头,用于解释代码的作用。
注释可以提高脚本的可读性,也方便其他人阅读和理解脚本。
2. 变量:变量用于存储和引用数据。
在Shell脚本中,变量名以""符号开头,可以是字母、数字、下划线的组合,不区分大小写。
变量可以通过赋值语句进行初始化,例如:`name="John"`。
变量的值可以通过""符号进行引用,例如:`echo name`。
3. 常量:常量是指在脚本中固定不变的值。
在Shell脚本中,可以使用`readonly`命令将变量声明为常量,例如:`readonly PI=3.14159`。
常量的值不能被修改。
4. 条件判断:Shell脚本可以根据条件的真假来执行不同的代码。
常用的条件判断命令有`if`、`else`、`elif`等。
.sh的语法
.sh的语法.sh文件通常包含shell脚本命令,是一种脚本语言,用于解释和执行这些命令。
以下是一些常见的.sh语法和概念:1.注释:在.sh文件中,注释是以“#”符号开头的行。
例如:bash复制代码# 这是一个注释2.变量:在.sh文件中,变量是由用户定义的,用于存储数据。
变量名以字母或下划线开头,后面可以跟字母、数字或下划线。
例如:bash复制代码name="John"age=253.字符串操作:.sh支持一些基本的字符串操作,例如连接、比较和提取子字符串等。
例如:bash复制代码greeting="Hello, "name="John"full_name = $greeting$nameecho$full_name# 输出 "Hello, John"4.条件语句:.sh支持使用if、elif和else条件语句进行条件判断。
例如:bash复制代码if [ $age -lt 18 ]; thenecho"未成年"elif [ $age -ge 18 ]; thenecho"成年"elseecho"未知年龄"fi5.循环语句:.sh支持使用for和while循环语句进行重复执行操作。
例如:bash复制代码for i in {1..5}; doecho$idone6.函数:在.sh中,函数是由一系列语句组成的代码块,可以通过函数名调用执行。
例如:bash复制代码say_hello() {echo"Hello, $1"}say_hello John # 输出 "Hello, John"。
Linux系统自动化运维脚本使用Shell脚本实现对Linux系统运维工作的自动化执行
Linux系统自动化运维脚本使用Shell脚本实现对Linux系统运维工作的自动化执行Linux系统的运维工作对于系统管理员来说是非常繁琐而重要的,为了提高效率和减少人为错误,自动化运维脚本被广泛使用。
而Shell脚本则是一种强大的工具,可以通过编写脚本来实现对Linux系统的自动化运维工作。
本文将通过介绍Shell脚本的基本用法和示例,探讨如何使用Shell脚本来实现对Linux系统的自动化运维。
一、Shell脚本的基本概念和用法Shell是一种命令行解释器,常用的有Bash、Csh、Ksh等。
Shell脚本是一系列Shell命令的集合,可以通过编写脚本来实现对系统的自动化操作。
下面是一些Shell脚本的基本用法:1. Shebang每个Shell脚本的第一行都需要指定Shebang,即告诉系统使用哪种Shell执行该脚本。
常见的Shebang是#!/bin/bash。
2. 变量的定义和使用Shell脚本使用变量可以方便地存储和操作数据。
变量的定义格式为:变量名=值,例如:name="John"。
使用变量时需要在变量名前加上美元符号,例如:echo $name。
3. 条件语句可以使用条件语句来实现根据条件执行不同的操作。
常见的条件语句有if语句和case语句。
例如:```if [ $num -gt 10 ]; thenecho "The number is greater than 10."fi``````case $fruit in"apple")echo "It's an apple.";;"orange")echo "It's an orange.";;*)echo "Unknown fruit.";;esac```4. 循环语句循环语句可以用来重复执行一段代码。
sh命令用法 -回复
sh命令用法-回复sh命令用法详解sh命令是Linux系统中最常用的命令之一,它是Shell(壳)的一种类型,用于执行命令、脚本文件以及控制进程。
在本篇文章中,我们将详细了解sh命令的使用方法,帮助读者更好地理解和运用sh命令。
一、什么是sh命令?sh命令是指shell命令的缩写,它是用于交互式地运行命令或运行脚本文件的一种命令行解释器。
在Linux系统中,常见的shell命令有sh、bash、csh、ksh等,每种shell都有自己的特点和使用方法。
二、sh命令的基本用法1. 运行命令:sh命令可以直接用于运行命令,只需在终端中输入命令即可。
例如,输入“sh ls”,即可执行ls命令,展示当前目录下的所有文件和文件夹。
2. 运行脚本文件:sh命令常用于运行脚本文件,例如Shell脚本文件(后缀为.sh)。
要运行脚本文件,只需输入“sh 脚本文件路径”。
例如,输入“sh /home/user/test.sh”,即可运行位于/home/user目录下的test.sh 脚本文件。
3. 执行命令组合:sh命令可以执行多个命令组合,只需将命令用分号隔开即可。
例如,输入“sh ls; echo Hello”,即可先执行ls命令,再执行echo命令。
4. 执行后台任务:sh命令可以执行后台任务,在命令结尾加上“&”即可。
例如,输入“sh command &”,即可将command命令放到后台执行。
5. 重定向和管道:sh命令可以使用重定向和管道操作符来处理命令的输入和输出。
例如,输入“sh ls > file.txt”,即可将ls命令的输出重定向到file.txt文件中。
又如,输入“sh cat file.txt grep keyword”,即可将file.txt文件的内容通过管道传递给grep命令进行筛选。
6. 命令参数:sh命令可以接受命令参数,参数通常用空格分隔。
例如,输入“sh ls -l”,即可执行带有参数“-l”的ls命令,以列表形式展示当前目录的详细信息。
Shell脚本常用模板
Shell脚本常⽤模板 作为⼀个运维⼈员编写Shell脚本是很平常的,⼀个格式好的脚本不仅赏⼼悦⽬,后期⾃⼰和别⼈也易于维护。
下⾯的脚本就是我⾃⼰的shell编写格式,如下:1 [root@mini05 20180930-2]# cat template.sh2 #!/bin/sh3 ################ Version Info ##################4 # Create Date: 2018-09-295 # Author: Zhang6 # Mail: zhang@7 # Version: 1.08 # Attention: shell脚本模板9 ################################################1011 # 加载环境变量12 # 如果脚本放到crontab中执⾏,会缺少环境变量,所以需要添加以下3⾏13 . /etc/profile14 . ~/.bash_profile15 . /etc/bashrc1617 # 脚本所在⽬录即脚本名称18 script_dir=$( cd "$( dirname "$0" )" && pwd )19 script_name=$(basename ${0})20 # ⽇志⽬录21 log_dir="${script_dir}/log"22 [ ! -d ${log_dir} ] && {23mkdir -p ${log_dir}24 }2526 errorMsg(){27echo"USAGE:$0 arg1 arg2 arg3"28 exit 229 }303132 doCode() {33echo $134echo $235echo $336 }3738 main() {39if [ $# -ne 3 ];then40 errorMsg41fi42 doCode "$1""$2""$3"43 }4445 # 需要把隐号加上,不然传⼊的参数就不能有空格46 main "$@"测试如下:1 [root@mini05 20180930-2]# ./template.sh2 USAGE:./template.sh arg1 arg2 arg33 [root@mini05 20180930-2]# ./template.sh1114 USAGE:./template.sh arg1 arg2 arg35 [root@mini05 20180930-2]# ./template.sh111'222 333'6 USAGE:./template.sh arg1 arg2 arg37 [root@mini05 20180930-2]# ./template.sh111'222 333'"444 555"811192223331044455511 [root@mini05 20180930-2]# ./template.sh111'222 333'"444 555""666"12 USAGE:./template.sh arg1 arg2 arg3。
sh脚本语法
一、开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序。
在这个例子中我们使用/bin/sh来执行程序。
当编写脚本完成时,如果要执行该脚本,还必须使其可执行。
要使编写脚本可执行:编译chmod +x filename 这样才能用./filename 来运行二、注释在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。
三、变量在shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明。
要赋值给一个变量,可以这样写:#!/bin/sh#对变量赋值:a=”hello world”# 现在打印变量a的内容:echo “A is:”echo $a有时候变量名很容易与其他文字混淆,比如:num=2echo “this is the $numnd”这并不会打印出”this is the 2nd”,而仅仅打印”this is the “,因为shell会去搜索变量numnd的值,但是这个变量时没有值的。
可以使用花括号来告诉shell我们要打印的是num变量:num=2echo “this is the ${num}nd”这将打印:this is the 2nd四、环境变量由export关键字处理过的变量叫做环境变量。
我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。
五、Shell命令和流程控制在shell脚本中可以使用三类命令:1)Unix 命令:虽然在shell脚本中可以使用任意的unix命令,但是还是有一些相对更常用的命令。
这些命令通常是用来进行文件和文字操作的。
常用命令语法及功能echo “some text”: 将文字内容打印在屏幕上ls: 文件列表wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数cp sourcefile destfile: 文件拷贝mv oldname newname : 重命名文件或移动文件rm file: 删除文件grep ‘pattern’ file: 在文件内搜索字符串比如:grep ’searchstring’ file.txtcut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令cat file.txt: 输出文件内容到标准输出设备(屏幕)上file somefile: 得到文件类型read var: 提示用户输入,并将输入赋值给变量sort file.txt: 对file.txt文件中的行进行排序uniq: 删除文本文件中出现的行列比如:sort file.txt | uniqexpr: 进行数学运算Example: add 2 and 3expr 2 “+” 3find: 搜索文件比如:根据文件名搜索find . -name filename -printtee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile basename file: 返回不包含路径的文件名比如:basename /bin/tux将返回tux dirname file: 返回文件所在路径比如:dirname /bin/tux将返回/binhead file: 打印文本文件开头几行tail file : 打印文本文件末尾几行sed: Sed是一个基本的查找替换程序。
解决电脑上无法打开的sh文件的技巧
解决电脑上无法打开的sh文件的技巧解决电脑上无法打开的.sh文件的技巧随着科技的发展,电脑已经成为我们生活和工作中不可或缺的工具。
然而,有时我们可能会遇到一些问题,例如无法打开.sh文件。
虽然这个问题比较常见,但是解决它可能并不容易。
在本文中,我将为您提供一些解决这个问题的技巧。
1. 确认文件类型首先,您需要确认.sh文件的类型。
在计算机上,文件类型通过文件扩展名来标识。
一个.sh文件是一个Shell脚本文件,用于运行Linux或Unix操作系统的命令。
确保文件扩展名为.sh,以便系统正确识别并打开它。
2. 使用合适的文本编辑器.sh文件通常用文本编辑器打开,以便查看和编辑其内容。
在Windows上,您可以使用Notepad++或Sublime Text等专业的文本编辑器,避免使用常规的记事本工具。
这些专业的编辑器支持代码高亮和自动完成等功能,有助于提高效率和准确性。
3. 确认文件权限当您尝试运行.sh文件时,如果遇到权限问题,会导致无法打开。
在Linux或Unix系统上,您需要给.sh文件设置执行权限。
可以使用chmod命令来更改文件权限。
具体的命令是"chmod +x filename.sh",其中filename是.sh文件的名称。
4. 检查脚本语法和依赖.sh文件是由一系列命令组成的脚本,它们需要依赖于操作系统和其他程序。
当您无法打开.sh文件时,可能是因为脚本中存在语法错误或者缺少必要的依赖。
您可以尝试在终端中运行.sh文件,以查看是否有任何错误提示信息。
此外,确保您的系统具有所需的依赖软件,并且已正确安装和配置。
5. 文件损坏或编码问题有时,.sh文件可能会出现损坏或者编码问题,导致无法正常打开。
在这种情况下,您可以尝试重新下载或复制.sh文件,以确保它没有损坏。
此外,如果您在不同的操作系统之间复制.sh文件,可能会遇到编码问题。
确保文件的编码格式与您的操作系统兼容,可以尝试将文件编码格式转换为UTF-8。
Linux下脚本执行命令sh
Linux下脚本执⾏命令sh
需要执⾏权限
任意路径:
输⼊完整路径及脚本名
例⼦:
/root/datelog.sh
当前路径:
./脚本名
例⼦:
./datelog.sh
没有执⾏权限
任意路径:
sh 完整路径及脚本名
例⼦:
sh /root/ datelog.sh
当前路径:
sh 脚本名
例⼦:
sh datelog.sh
原⽂链接:https://juejin.im/post/5d2480a7f265da1b6836e3
拓展:
PS: source 和 ./的区别
./script 作为⼀个可执⾏⽂件来运⾏脚本,启动⼀个⼦shell来运⾏它,当执⾏完脚本之后,⼜回到了⽗shell中,所以在⼦shell中执⾏的⼀切操作都不会影响到⽗shell;
source script 在当前shell环境中从⽂件名读取和执⾏命令。
注意:./script 不是 . script ,但是 . script 类似于source script
使⽤./ 运⾏脚本的时候,系统变量不会受到影响,⽽使⽤source的时候,会影响到系统当前的环境变量。
Linux-[sh]脚本语法
Linux-[sh]脚本语法⼀、⽂件开头#!/bin/sh符号#!⽤来告诉系统它后⾯的参数是⽤来执⾏该⽂件的程序编写完的sh脚本使其可执⾏:sudo chmod +x filename⼆、变量在shell编程中,所有的变量都由字符串组成,并且不需要对变量进⾏声明对变量赋值:param = "hello world"打印变量:echo $param混⽤:num=2echo "this is the ${num}nd"# 这将打印: this is the 2nd三、shell命令和流程控制在shell脚本中可以使⽤三类命令:1) Unix 命令:base: cp拷贝/mv移动或重命名/rm删除/cat输出预览/find搜索直接打印字符串内容:echo "k210 nb"计算⽂件⾏数/⽂件中的单词数/⽂件中的字符数:wc –l filewc -w filewc -c file在⽂件内搜索字符串:grep 'namespace' file.cpp指定欲显⽰的⽂件内容范围,并将它们输出到标准输出设备:cut -b colnum file# 输出每⾏第5个到第9个字符cut -b 5-9 file.cpp得到⽂件类型:file somefile提⽰⽤户输⼊,并将输⼊赋值给变量:read param打印⽂本⽂件开头⼏⾏/末尾⼏⾏:head filetail file2) 概念: 管道,重定向和backtick管道(|)—–将⼀个命令的输出作为另外⼀个命令的输⼊# 在file.txt中搜索包含有"hello"的⾏并计算其⾏数grep "hello" file.txt | wc -l重定向—–将本应输出在终端上的内容写⼊到指定⽂件中> # 写⼊⽂件并覆盖旧⽂件(没有则创建)ls > test.txt>> #将输出内容追加到⽬标⽂件(没有则创建)backtick(``)—–使⽤反短斜线可以将⼀个命令的输出作为另外⼀个命令的⼀个命令⾏参数# 将所查找到的⽂件打包tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`3) 流程控制1.if表达式# 基本结构...elif ...; then...else...fi通常⽤"[ ]"来表⽰条件测试。
sh 调用方法
sh 调用方法
在shell脚本中,有三种方法可以调用其他脚本,分别是:fork、exec和source。
1. fork:这是最普通的方法,直接在脚本中使用路径调用其他脚本。
运行时会在子shell中执行调用的脚本,父shell仍在运行。
子shell执行完毕后返回父shell,子shell从父shell继承环境变量,但子shell中的环境变量不
会带回父shell。
2. exec:与fork不同,exec不需要新开一个子shell来执行被调用的脚本。
被调用的脚本与父脚本在同一个shell内执行。
3. source或.:当在脚本中使用source或.来调用其他脚本时,会将被调用
的脚本中的内容拷贝过来,由一个shell进程来执行。
与使用bash命令来
调用脚本有着本质的区别,使用bash命令会开启新的shell进程来执行脚本。
以上信息仅供参考,如有需要,建议咨询专业的计算机技术人员。
sh脚本命令
sh脚本命令cremeb多商户打包代码的时候,总是重复的⼯作,就想着写了个脚本,记录⼀下sh脚本⽤到的⼀下⽅法:⼩姐姐⼆维码1. `#!/bin/bash` ⽂件第⼀⾏,提⽰电脑后⾯的代码需要⽤ /bin/bash 来解读2. `echo` 输出内容,3. `param=$(cat ./test.txt)` 变量赋值,参数名\等号\值,三个之间不能有空格,如果需要得到某够命令获取的信息作为值,都可以⽤这种⽅式,变量=$(命令);4. 变量赋值单引号与双引号的区别,单引号不会转义内容,双引号会转义内容;5. 变量的使⽤ ` $param`或者` ${param}`即可使⽤;6. 获取⽤户输⼊值```shellecho "请输⼊你想要输⼊的值"read inputValueecho $inputValue #这⾥打印出来的就是⽤户输⼊的值param=$inputValue #这⾥将⽤户输⼊的值赋给了paramecho $param #这⾥打印出来的也是⽤户输⼊的值```7. sh 下标传⼊参数 `sh ./test.sh a b ````shell#!/bin/bashecho $0 # test 执⾏的⽂件名echo $1 #a 第⼀个参数echo $2 #b 第⼆个参数可以继续写echo $# #2 传递到脚本的参数个数echo $* #a b 以⼀个单字符串显⽰所有向脚本传递的参数echo $$ # 当前的进程号echo $! #d 后台运⾏的最后⼀个进程号..```8. `getopts` sh脚本传参数⽅法,如:`test.sh -a 1`创建脚本 test.sh```shell#!/bin/bashwhile getopts "a:w:p:n" arg; #这⾥设定了参数必须是-a;-w;-p;-n这⼏个参数名,后⾯的冒号表⽰必须传⼊参数docase $arg ina ) #所有版本号统⼀parms1="$OPTARG";;w ) #前端版本号parms2="$OPTARG";;p ) #php版本号parms3="$OPTARG";;n ) #最新版本号parms4=1;;)echo "未知参数: -a; -w ; -p ; -n "exitesacdone```例如执⾏ `sh ./test.sh -a 1` 可以选择参数名-a 就必须传⼊参数 1,-n则可以不⽤参数;9. 字符串的操作```shellparam='abcd_';param1="$param"'efgh' #拼接字符串,直接跟着写即可echo $param1 #abcd_efghecho ${#param1} #计算字符串长度输出 9echo ${param1:1:4} #截取字符串从1号下标开始到4号结束输出 bcd_ 都知道下标从0开始的吧echo ${param1#abcd_} #从左相右匹配截取剩下的字符串,注意必须从头开始算,也就是说不能写个d_开始匹配, 输出efgh echo ${param1#*_} #从左相右匹配截取剩下的字符串*代表任意,类似 .* 输出efghecho ${param1%gh} #从右向左匹配截取剩下的字符串,注意必须从末尾开始算,也就是说不能写个_e开始匹配, 输出 abcd_ef echo ${param1%_*} #从右向左匹配截取剩下的字符串*代表任意,类似 .* 输出abcd_efecho ${param1:0-4} #从右向左匹配2个,截取输⼊ efghecho ${param1:0-4:2} #从右向左截取4个,然后在从这4个中,从左向右截取2个输出 gh```10. 数组```shellarray=(a b c d) #数组的定义echo ${array[*]} 或 echo ${array[@]} #输出数组全部值 a b c decho ${array[0} # a 下标式输出```11. 数字的运算,必须⽤ “`”这个符号包起来,这不是单引号,是反引号```shellecho `expr 1 + 1 ` #加echo `expr 2 - 1 ` #减echo `expr 2 \* 2` #乘echo `expr 4 / 2 ` #除echo `expr 5 % 2 ` #取余数let a=1+1let b=2-1echo $a $b # let 定义⼀个或多个表达式```12. `if`流程控制```shellif [ ] ;#条件,注意空格then #执⾏elif #条件then #执⾏else #否fi #结束标签! # ⾮ if [ $a !$b ]-a #and 与 if [ $a -a $b ]-o #or 或 if [ $a -o $b ]&& # AND|| # OR数字的⽐较-eq #检测两个数是否相等-ne #检测两个数是否不相等-gt #检测左边的数是否⼤于右边的-lt #检测左边的数是否⼩于右边的-ge #检测左边的数是否⼤于等于右边的-le #检测左边的数是否⼩于等于右边的字符串的⽐较= 检测两个字符串是否相等!= 检测两个字符串是否不相等-z 检测字符串长度是否为0-n 检测字符串长度是否不为 0$ 检测字符串是否为空⽂件夹⽐较-e 判断对象是否存在-d 判断对象是否存在,并且为⽬录-f 判断对象是否存在,并且为常规⽂件-L 判断对象是否存在,并且为符号链接-h 判断对象是否存在,并且为软链接-s 判断对象是否存在,并且长度不为0-r 判断对象是否存在,并且可读-w 判断对象是否存在,并且可写-x 判断对象是否存在,并且可执⾏-O 判断对象是否存在,并且属于当前⽤户-G 判断对象是否存在,并且属于当前⽤户组-nt 判断file1是否⽐file2新 [ "/usr/test1.txt" -nt "/usr/test2.txt" ]-ot 判断file1是否⽐file2旧 [ "/usr/test1.txt" -ot "/usr/test2.txt" ]```13. for 循环```shellparam=(1 2 3 4 5 6 7 8)for i in ${param[*]} # 这个in后⾯的要是输出的形式展⽰doecho $i # 1 2 3 4 5 6 7 8done```14. while 循环```shelli=1while(( $i<7 )) #当这个条件成功,则不在执⾏doecho $ilet "i++" # 1 2 3 4 5 6done```15. `break` 跳出循环整个循环体都不在执⾏,`continue `跳过本次循环继续下⼀个循环,`exit` 结束脚本;16. 函数⽅法```shell#定义函数function name(){return 1}name(){}name 1 2 #函数调⽤,(1,2)是传⼊的参数param=$? #获取函数renturn回来的值echo $param #2 函数返回的值```##### 暂时就⽤到这些。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] :判断$var变量是否有值
[ "$a" = "$b" ] :判断$a和$b是否相等
不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。
case表达式可以用来匹配一个给定的字符串,而不是数字。
case ... in
...) do something here
esac
让我们看一个例子。 file命令可以辨别出一个给定文件的文件类型,比如:
num=2
echo "this is the ${num}nd"
这将打印: this is the 2nd
有许多变量是系统自动设定的,这将在后面使用这些变量时进行讨论。
如果您需要处理数学表达式,那么您需要使用诸如expr等程序(见下面)。
除了一般的仅在程序内有效的shell变量以外,还有环境变量。由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。
cat file.txt: 输出文件内容到标准输出设备(屏幕)上
file somefile&: 得到文件类型
read var: 提示用户输入,并将输入赋值给变量
sort file.txt: 对file.txt文件中的行进行排序
uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq
如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。程序必须以下面的行开始(必须方在文件的第一行):
#!/bin/sh
符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
grep 'pattern' file&: 在文件内搜索字符串比如:grep 'searchstring' file.txt
cut -b colnum file&: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令
执行man test可以查看所有测试表达式可以比较和判断的类型。
直接执行以下脚本:
#!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; then
echo "your login shell is the bash (bourne again shell)"
grep "^From " $mailfolder
该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的"From" 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:
-打印错误信息
-退出程序
我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。
else
echo "your login shell is not bash but $SHELL"
fi
变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。
快捷操作符
熟悉C语言的朋友可能会很喜欢下面的表达式:
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F,'{print $1 "," $3 }'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor,34, IndiaKerry Miller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA
#!/bin/sh
ftype=`file "$1"`
用来查找过去24小时(-mtime -2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes ('):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。您也可以认为是逻辑运算中的与操作。上例中表示如果 /etc/shadow文件存在则打印" This computer uses shadow passwors"。同样或操作(||)在shell编程中也是可用的。这里有个例子:
重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
> 写入文件并覆盖旧文件
>> 加到文件的尾部,保留旧文件内容。
反短斜线
使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
命令:
find . -mtime -1 -type f -print
ls: 文件列表
wc -l filewc -w filewc -c file&: 计算文件行数计算文件中的单词数计算文件中的字符数
cp sourcefile destfile&: 文件拷贝
mv oldname newname : 重命名文件或移动文件
rm file&: 删除文件
变量
在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:
变量名=值
取出变量值可以加一个美元符号($)在变量前面:
#!/bin/sh
#对变量赋值:
a="hello world"
流程控制
"if" 表达式如果条件为真则执行then后面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等...
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r "$mailfolder" ]' '{ echo "Can not read $mailfolder"exit 1; }
echo "$mailfolder has mail from:"
expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3
find: 搜索文件比如:根据文件名搜索find . -name filename -print
tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus 替换为 LinuxFocus : cat text.file | sed 's/linuxfocus/LinuxFocus/' > newቤተ መጻሕፍቲ ባይዱext.file
file lf.gz
这将返回:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:
概念: 管道, 重定向和 backtick
这些不是系统命令,但是他们真的很重要。
管道 (|) 将一个命令的输出作为另外一个命令的输入。
grep "hello" file.txt | wc -l
在file.txt中搜索包含有"hello"的行并计算其行数。
在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。
下面,让我们一起来看看shell是如何工作的:
建立一个脚本
Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在 bash的大姐,bourne shell 中运行)。