参考链接:https://juejin.cn/post/7249347651787980861
Shell脚本是一种命令语言,可以用于自动化执行各种任务。在脚本中,我们可以通过参数来传递信息,这样脚本就可以根据这些信息来执行特定的操作。本文将介绍如何在shell脚本中传递参数以及常用语法。
#!/bin/bash
称为shebang或sha-bang、hashbang。是一个特殊的字符序列,由井号“#”和叹号“!”组成,放在脚本文件的第一行开头。在Linux和类Unix操作系统中,这个字符序列用于指定脚本文件的解释器路径。当一个脚本文件的第一行包含了shebang,操作系统在执行该文件时会将该路径后的所有参数传递给指定的解释器,让它来解释执行该脚本。常见的解释器包括Bash shell、Python、Perl等,可以使用对应的路径来指定解释器。例如,#!/usr/bin/python
表示使用Python解释器来执行脚本。
如果一个文件没有shebang行,系统就不知道用哪个解释器来执行它。此时,如果这个文件具有可执行权限(例如755),系统会把它作为一个shell脚本来执行,使用的是默认的shell解释器(在大多数Unix/Linux系统中,这是Bash shell)。
用等号=
来赋值:
例如变量名name
赋值字符串"hello"
name="hello"
使用$
来调用输出变量:$name
if语句的具体用法可以参考:https://blog.csdn.net/wxx_0124/article/details/95305625
下面的实例展示了字符串和数值的比较:
数值判断:
val = 100
if [ $val -gt 18 ]; then
echo "Val is greater than 18"
elif [ $val -eq 18 ]; then
echo "Val is equal to 18"
else
echo "Val is little than 18"
fi
运行:sh run.sh
输出:
Val is greater than 18
数值判断符号:
[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=
字符串比较:
#!/bin/bash
SYSTEM="Linux"
if [ $SYSTEM = "Linux" ] ; then
echo "Linux"
elif
[ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif
[ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi
输出:
Linux
# for语句
for i in 1 2 3 4 5; do
echo $i
done
# while语句【使用了变量】
i=0
while [ $i -lt 10 ]; do
echo $i
i=$((i+1))
done
function sayHi {
echo "Hello, $1!"
}
sayHi "Kite"
# read 命令会等待输入
echo "What's your name?"
read name
echo "Hello, $name!"
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件
if [ $age -gt 18 ] && [ $gender == "male" ]; then
echo "You are a man."
fi
在shell脚本中,可以使用位置参数来传递信息。可以使用$1,$2,$3
等来访问传入的第一个、第二个、第三个变量。此外,还有系统默认的变量,例如,$0
内容是shell脚本的名称,$#
表示传递给脚本的参数个数,$@
表示所有传递给脚本的参数的列表。
给定run.sh
文件,内容如下:
#!/bin/bash
echo "The script name is $0"
echo "The first argument is $1"
echo "The second argument is $2"
执行命令:sh run.sh hello world
输出:
The script name is run.sh
The first argument is hello
The second argument is world
在shell脚本中,可以获得环境变量的内容,可对执行环境进行检验。
#!/bin/bash
echo "The value of HOME is $HOME"
echo "The value of PATH is $JAVA_HOME"
The value of HOME is /root
The value of PATH is /usr/local/java/jdk1.8.0_241
getopts
是Bash shell自带的命令行参数处理工具,它的语法比较简单,只支持处理单个字母选项,例如-a、-b
等。getopts只能处理短选项,也就是只能使用一个字母来表示选项。另外,getopts
处理命令行参数时会把选项和参数分别处理,不能处理连续的选项,例如-abc
。
#!/bin/bash
while getopts n:a:g: opt
do
case "${opt}" in
n) name=${OPTARG};;
a) age=${OPTARG};;
g) gender=${OPTARG};;
esac
done
echo "NameVal: $name";
echo "AgeVal: $age";
echo "GenderVal: $gender";
运行命令,传递参数给变量name
,age
,gender
:
sh run.sh -n Kite -a 18 -g f
输出:
NameVal: Kite
AgeVal: 18
GenderVal: f
getopt
是GNU工具集中的一个命令行参数处理工具,它支持更多的选项和语法,可以处理短选项和长选项,还可以处理连续的选项。getopt的语法比getopts更加复杂,需要指定一个选项字符串,包含了所有支持的选项和参数。getopt将解析后的选项和参数保存在一个数组中,需要在代码中处理这个数组。
getopt
命令有以下几个参数:
-o
:指定单字符选项。选项之间无需分隔符。--long
:指定长选项。长选项之间使用逗号分隔。:
:选项后添加冒号说明当前选项需要参数值。--
:分割选项和参数。"$@"
:表示将所有命令行参数作为一个字符串传递给getopt命令。options=$(getopt -o n:a:g:p --long name:,age:,gender:,print -- "$@")
会解析命令行选项和参数,并将转换后的选项和参数存储在变量options
中。这个变量通常会传递给一个eval
命令进行处理,例如:eval set -- "$options"
#!/bin/bash
# 解析命令行参数
options=$(getopt -o n:a:g:p --long name:,age:,gender:,print -- "$@")
eval set -- "$options"
# 提取选项和参数
while true; do
case $1 in
-a | --age) shift; age=$1 ; shift ;;
-n | --name) shift; name=$1 ; shift ;;
-g | --gender) shift; gender=$1 ; shift ;;
-p | --print) print=true; shift ;;
--) shift ; break ;;
*) echo "Invalid option: $1" exit 1 ;;
esac
done
echo "NameVal: $name; AgeVal: $age; GenderVal: $gender";
命令运行:
# 脚本调用(长选项)
sh run.sh --name Kite --age 18 --gender f -p
# 脚本调用(单字符选项)
sh run.sh -n Kite -a 18 -g f -p
输出:
NameVal: Kite; AgeVal: 18; GenderVal: f