脚本框架控制参数开始与停止。脚本需要两个参数,如果没有输入两个
参数,那么产生一个u s a g e语句。注意这里使用c a s e语句处理输入脚本的不同参数。
#!/bin/bash
# opt.sh
usage()
{
echo "usage: `basename $0` start|stop process name"
}
OPT=$1
PROCESSID=$1
if [ $# -ne 2 ]; then
usage
exit 1
fi
case $OPT in
start|Start) echo "Starting..$PROCESSID"
# some process to go here
;;
stop|Stop) echo "Stopping..$PROCESSID"
# some process to go here
;;
*)usage
;;
esac
执行脚本,输入一下参数,结果为:
[root@localhost ~]# sh opt.sh start named
Starting..start
[root@localhost ~]# sh opt.sh start
usage: opt.sh start|stop process name
任何U N I X或L I N U X命令均接受一般格式:
命令选项文件选项部分最多可包含1 2个不同的值。上述脚本中,如果必须控制不同的命令选项,就要
加入大量脚本。这里只控制两个选项:开始和停止。
幸运的是s h e l l提供s h i f t命令以帮助偏移选项,使用s h i f t可以去除只使用$ 1到$ 9传递参数的
限制。
shift命令
向脚本传递参数时,有时需要将每一个参数偏移以处理选项,这就是s h i f t命令的功能。
它每次将参数位置向左偏移一位,下面用一段简单脚本详述其功能。脚本使用w h i l e循环反馈
所有传递到脚本的参数。
shift命令简单用法
使用s h i f t命令来处理传递到脚本的每一个参数。改动后脚本如下:
#!/bin/bash
# opt2.sh
loop=0
while [ $# -ne 0 ] # while there are still arguments
do
echo $1
shift
done
现在执行一下,结果就会明显不同了。如下所示:
file1
file2
file3
命令行输入的最后一个参数
虽然还没有讲e v a l命令,如果需要知道命令行中输入的最后一个参数(通常是一个文件名),
可以有两种选择:使用命令eval echo \$$#;使用s h i f t命令:shift 'expr $# -2'。
------
使用shift处理文件转换
s h i f t可使控制命令行选项更加容易。下面构造一个转换脚本,使用t r将文件名转换为大写
或小写。
脚本选项为:
-l 用于小写转换。
-u 用于大写转换。
使用s h i f t命令将脚本放在一起以控制- l和- u选项。脚本的第一版本如下:
#!/bin/bash
# tr_case.sh
# case conversion
usage()
{
# usage
echo "usage: `basename $0` -[l|u] file [files]" >&2
exit 1
}
if [ $# -eq 0 ]; then
# no parameters passed !
fi
while [ $# -gt 0 ]
do
case $1 in
-u|-U) echo "-u option specified"
# do any setting of variables here for lowercase then shift
shift
;;
-l|-L) echo "-l option specified"
# do any setting of variables here for uppercase then shift
shift
;;
*) usage
;;
esac
done
首先检查脚本是否有参数,如果没有,打印u s a g e语句,如果有需要处理的参数,使用
c a s e语句捕获每一个传送过来的选项。当处理完此选项后,使用s h i f t命令搜集命令行中下一选
项,如果未发现匹配选项,打印u s a g e语句。
当向脚本传递两个无效参数时
下一步就是要用c a s e语句处理选项后传递过来的文件名。为此需改动c a s e语句。c a s e语句
中捕获任意模式*应该为- *以允许传递无效选项,例如- p或- q。
*模式也匹配传递过来的所有文件名,以便用f o r循环处理每一个文件,这里也将使用- f选
项检测文件是否存在。
改动后的c a s e语句如下:
case
......
-*) echo "usage: `basename $0` -[l|u] file [file..]"
exit 1
;;
*) # collect the files to process
if [ -f $1 ]; then
# add the filenames to a variable list
FILES=$FILES" "$1
else
echo "`basename $0`: Error cannot find the file $1"
fi
shift
;;
esac
还需要指定与选项( - l,- u)相关的变量设置。这些变量是:
T R C A S E 保存转换类型(大写或小写)。
E X T 所有文件转换后,大写文件名为. U C,小写为. L C,不保存初始文件状态。
O P T 如果给出此选项,设其为y e s,否则为n o。如果没有给出此选项,捕获此信息并反
馈出来。
其他部分脚本用于实际转换处理,这里即t r命令。t r命令放在c a s e语句f o r循环中读取文件
名进行处理的脚本末尾部分。
以下为完整脚本:
#!/bin/bash
# tr_case.sh
# case conversion
# convert files to either upper or lower case
FILES=""
TRCASE=""
EXT=""
OPT=no
# gets called when a conversion fails
# do any setting of variables here for lowercase then shift
shift
;;
error_msg()
{
_FILENAME=$1
shift
;;
echo "`basename $0`: Error the conversion failed on $_FILENAME"
}
if [ $# -eq 0 ]; then
usage
# no parameters passed !
fi
while [ $# -gt 0 ]
do
case $1 in
# set the variables based on what option was used
-u) TRCASE=upper
EXIT".UC"
OPT=yes
shift
;;
-l) TRCASE=lower
EXT=".LC"
OPT=yes
shift
;;
-help) echo "convert a file(s) to uppercase from lowercase"
echo "convert a file(s) from lowercase to uppercase"
echo "will convert all characters according to the"
;;
echo " specified command option."
echo " Where option is"
echo " -l Convert to lowercase"
echo " -u Convert to uppercase"
echo " The original file(s) is not touched. A new file(s)"
echo "will be created with either a .UC or .LC extension"
echo "usage: $0 -[l|u] file [file..]"
exit 0
;;
-*) echo "usage: `basename $0` -[l|u] file [file..]"
exit 1
;;
*) # collect the files to process
if [ -f $1 ]; then
# add the filenames to a variable list
FILES=$FILES" "$1
else
echo "`basename $0`: Error cannot find the file $1"
fi
shift
;;
esac
done
# no options given ... help the user
if [ "$OPT" == "no" ]; then
echo " try `basename $0` --help"
exit 1
fi
# now read in all the file(s)
# use the variable LOOP, I just love the word LOOP
for LOOP in $FILES
do
case $TRCASE in
lower) cat $LOOP | tr "[a-z]" "[A-Z]" > $LOOP$EXT
if [ $? != 0 ]; then
error_msg $LOOP
else
echo "Converted file called $LOOP$EXT"
fi
;;
upper) cat $LOOP | tr "[A-Z]" "[a-z]" >$LOOP$EXT
if [ $? !=0 ]; then
error_msg $LOOP
else
echo "Converted file called $LOOP$EXT"
fi
;;
esac
done
执行上述脚本,给出不同选项,得结果如下:
转换一个不存在的文件:
[root@localhost ~]# sh tr_case.sh -k cursor
usage: tr_case.sh -[l|u] file [file..]
复制代码
传递不正确选项:
[root@localhost ~]# sh tr_case.sh cursor
tr_case.sh: Error cannot find the file cursor
tr_case.sh : Error you need to specify an option. No action taken
try tr_case.sh --help
复制代码
只键入文件名,希望脚本提示更多帮助信息:
[root@localhost ~]# sh tr_case.sh
For more info try tr_case.sh --help
复制代码
输入两个有效文件及第三个无效文件:
[root@localhost ~]# sh tr_case.sh -l file1 file2 sd
tr_case.sh: Error cannot find the file sd
Converted file called file1.LC
Converted file called file2.LC
复制代码
使用上述脚本可以将许多文件转换为同样的格式。编写一段脚本,使其控制不同的命令
行选项,这种方式编程量很大,是一件令人头疼的事。
假定要写一段脚本,要求控制以下各种不同的命令行选项:
命令-l -c 23 -v 文件1文件2
s h i f t命令显得力不从心,这就需要用到g e t o p t s命令。
分享到:
相关推荐
### 解决Unity不能调用shell脚本传递参数的问题 在Unity开发过程中,有时我们需要与操作系统进行交互,例如执行shell脚本来处理一些特定的任务。但在实际操作中,可能会遇到Unity无法正确调用shell脚本并传递参数的...
访问脚本接收到的参数,可以用来传递学生ID或作业名。例如,提交作业的命令可能是`./work-sys submit 001 homework.txt`。 5. **文件操作**:读取、写入和处理文件是Shell脚本的重要部分。`cat`, `grep`, `sed`, `...
- **命令参数**: shell-executor 允许传递额外的参数给命令,如工作目录、环境变量等,使得命令执行更具灵活性。 - **自定义命令处理器**: 用户可以定制自己的命令处理函数,以满足特殊需求,比如添加日志记录、命令...
- 参数和变量可以设置在不同层次,如工作流、工作集和会话中,提供了一种方式来存储和传递值。 - 参数文件是创建和管理这些参数和变量的主要工具,可以用文本编辑器创建,并包含各种类型的参数和变量,如...
- **作用**: Shell作为用户与Linux操作系统之间的接口,主要承担着命令解释器的角色,即用户通过Shell输入命令,Shell负责解释这些命令并将它们传递给操作系统内核进行执行。 - **历史**: Shell的历史可以追溯到UNIX...
14.4.2 向系统命令传递参数 142 14.4.3 特定变量参数 143 14.4.4 最后的退出状态 144 14.5 小结 145 第15章 引号 146 15.1 引用必要性 146 15.2 双引号 146 15.3 单引号 147 15.4 反引号 147 15.5 反斜线 148 15.6 ...
5. **函数**:定义和调用自定义函数,以及如何传递参数。 6. **输入/输出**:讲解标准输入、输出和错误输出,以及重定向的概念,如`>`、`、`|`等符号的用法。 7. **管道和重定向**:如何使用管道将命令连接起来,...
8. **脚本参数传递**: - `$1`, `$2`, ... `$n`表示脚本接收到的参数,`$0`是脚本本身的名称。 - 可以通过`getopts`或`case`语句解析带选项的命令行参数。 9. **脚本权限**: - 为使脚本可执行,需使用`chmod +x...
3. **构建shell脚本**:编写一个shell脚本,调用`app_process`并传递Java类的路径和参数。这个脚本将在shell环境中运行,所以它可以执行需要root权限的命令。 4. **执行shell脚本**:在Android设备上,通过adb或者...
- **特殊变量**: 包括 `$0` 表示脚本名称,`$1`, `$2` 等表示传递给脚本的参数。 - **数组**: Bash 也支持数组变量,可以使用 `name=(value1 value2)` 来初始化。 #### 算术表达式 - **基础运算**: 支持加、减、乘...
6. **脚本参数**:通过脚本参数可以传递外部数据,例如,启动考勤脚本时可以传入员工ID进行特定员工的考勤查询。 7. **函数**:定义和调用Shell函数可以使代码更模块化,便于复用和维护。 8. **错误处理和调试**:...
- 参数传递:了解如何在脚本中接收和处理命令行参数,如$0到$9的特殊变量。 6. **输入/输出重定向** - 标准输入(stdin)、标准输出(stdout)和标准错误(stderr)的概念。 - 如何使用>`>`、`>>`、`和`|`进行...
在编写脚本时,用户还可以利用Shell的各种特性,如变量、参数传递、管道(pipe)和重定向(redirection),来实现复杂的功能。 总的来说,Shell是Linux和Unix系统中不可或缺的一部分,它是用户与操作系统之间的重要...
- -v:定义变量,用于从shell中向awk脚本传递变量。 - -fprogfile:调用并执行指定的程序文件,该文件应符合awk语法。 awk内置变量包括: - ARGC:表示命令行参数的个数。 - ARGV:表示命令行参数数组。 - ARGIND:...
3. 脚本参数传递 4. 注释与程序头 5. 程序控制 5.1 if-then-elif-else-fi语句 5.2 for语句 5.3 while语句 5.4 until语句 5.5 break和continue命令 5.6 case语句 6. 常用命令集锦 六、shell后台运行程序---...
实验报告2 Shell及Shell编程主要关注Bash shell的使用,包括其功能、配置文件、脚本编写和常用命令。在Linux或Unix系统中,Shell是用户与操作系统交互的界面,Bash是最常用的Shell之一。 1. **Bash配置文件**: - ...