shift妙用之解决shell编程中的入参问题_linux shell

我说过了,shell是我的常规武器,目前虽然还不纯熟,但是我爱shell这门语言,在Linux下面混,总要写脚本。程序员是有基因,对编程语言是有偏好的,你让我写C代码,我会觉得很爽,会有困难,会有痛苦的摸索和学习,但是,我愿意;学习shell/python,我也很乐意,甚至Lisp这种冷门的语言我也充满了好奇,虽然现在Go和Erlang我一点也不懂,但是我按耐不住对这两种语言的兴趣,只要我抽出手来,一定会和他们缠绵一番。有爱就会有恨,我痛苦地意识到到自己是个很情绪化的程序员,哪怕我一遍遍地骂自己bitch is bitchy,一遍遍的告诉自己要端正态度,学习CSS/HTML/仍然让我痛苦的死去活来,可以预计的是,让我学习Java我也会很痛苦(我也清楚地明白,痛苦之烈一定不如学习CSS/HTML的痛苦)。我知道我在跑题,我贱人就是矫情,但是我压抑的太难受了,不找个地方发泄一下,我会把自己憋坏。

shell编程经常会遇到参数个数不定的这种情况,这种情况怎么处理呢?shift就要闪亮登场了。

$#是入参的个数,
$@是当前所有的入参
$0是脚本的名字
$1是第一个入参,$2是第二个入参。。。。

Bash定义了$1到$9,一共9个位置变量,这就决定了我们不能无限制的用$11之类的来获取更多的入参。
这时候就需要用shift了,shift会将入参右移,如下图所示:

我们看一段shell代码,加深理解:

复制代码 代码如下:

root@manu:~/code/shell/temp# cat test.sh
#!/bin/sh
until [ $# -eq 0 ]
do
echo "$@"
shift
done

看下输出:

复制代码 代码如下:

root@manu:~/code/shell/temp# ./test.sh 10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
7 6 5 4 3 2 1
6 5 4 3 2 1
5 4 3 2 1
4 3 2 1
3 2 1
2 1
1

现在,如果入參的个数不定,我们如何处理入参呢?

复制代码 代码如下:

until [ -z "$1" ] # Until all parameters used up
do
store_input $1
shift
done

上面这个伪码片段表明如何处理不定的入参,通过store_input,我们将每一个入参保存下来,然后,我们就可以处理了。
最后的最后,给出一个处理不定参数的例子:

复制代码 代码如下:

manu@manu:~/code/shell/temp$ cat sum.sh
#!/bin/sh
sum=0
until [ -z $1 ]
do
sum=`echo $sum+$1 |bc`
shift
done
echo $sum

输出如下:

复制代码 代码如下:

manu@manu:~/code/shell/temp$ ./sum.sh 1 2 3 4 5 6 7 8 9 10
55

参考文章:
http://www.jb51.net/article/40259.htm

时间: 2024-10-30 05:12:06

shift妙用之解决shell编程中的入参问题_linux shell的相关文章

shift妙用之解决shell编程中的入参问题

shell编程经常会遇到参数个数不定的这种情况,这种情况怎么处理呢?shift就要闪亮登场了   我说过了,shell是我的常规武器,目前虽然还不纯熟,但是我爱shell这门语言,在Linux下面混,总要写脚本.程序员是有基因,对编程语言是有 偏好的,你让我写C代码,我会觉得很爽,会有困难,会有痛苦的摸索和学习,但是,我愿意:学习shell/python,我也很乐意,甚至Lisp这种冷 门的语言我也充满了好奇,虽然现在Go和Erlang我一点也不懂,但是我按耐不住对这两种语言的兴趣,只要我抽出手

shell 编程中空格的使用方法_linux shell

1.定义变量时, =号的两边不可以留空格.eg: gender=femal----right gender =femal---–wrong gender= femal---–wrong2.条件测试语句 [ 符号的两边都要留空格.eg: if [ $gender = femal ]; then---right. echo "you are femal"; fi if[ $gender...-----------------------wrong if [$gender...-------

Shell编程中Shift的用法

http://www.cnblogs.com/image-eye/archive/2011/08/20/2147153.html 前一个例子看明白了,后面还没看清楚 Shell编程中Shift的用法 位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常有用的 Unix 命令:shift.我们知道,对于位置变量或命令行参数,其个数必须是确定的,或者当

Shell编程中while与for的区别及用法详解_linux shell

在shell编程中经常用到循环,常用的循环有for和while循环两种.while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别. 一.常用语法 1.for循环 for循环常用的语法结构有如下几种: for 变量 in seq字符串 for 变量 in `command` " " for 变量 in "$@"或"$*" for((赋值:条件:运算语句)) 2.while循环 while循

linux shell编程中date命令的用法

在linux shell编程中,经常用到日期的加减运算 以前都是自己通过expr函数计算,很麻烦 其实date命令本身提供了日期的加减运算 非常方便.例如:得到昨天的时间 date +%Y%m%d --date="-1 day" date 用法: date [OPTION]... [+FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] date 可以用来显示或设定系统的日期与时间. 令1.在显示方面,使用者可以设定欲显

shell 编程 语句-shell编程中的语句问题,求解答

问题描述 shell编程中的语句问题,求解答 #!/bin/bash use=cat cat_greet() { echo "hello cat" } if [ $use=cat ] then cat_greet fi no_exit=1 [[ $no_exit -eq 1 ]]&& exit(){true;} exit 这个程序输出结果为 hello cat 我想问的是 [[ $no_exit -eq 1 ]]&& exit() {true;} 这一句

shell编程中if [[ ! ${a} =~ ^[0-9]+ ]]条件判断式如何工作的?

问题描述 shell编程中if [[ ! ${a} =~ ^[0-9]+ ]]条件判断式如何工作的? if [[ ! ${a} =~ ^[0-9]+ ]]这个语句具体是怎么工作的?我只知道这个好像是如果变量a不是以数字开头就执行if语句,但是特别的: =~是什么意思? ^[0-9]+ 是什么意思?另外这个判断使用的是扩展正则表达式? 解决方案 这里只有^[0-9]+是正则表达式,表示一个数字,别的都不是正则. 解决方案二: 只是原样的字符 解决方案三: =~意思是匹配后面的正则式,^是匹配开头,

脚本-shell编程中随机产生数组里一个变量的代码怎么写?

问题描述 shell编程中随机产生数组里一个变量的代码怎么写? 想写一个与随机抽取有关的脚本,从定义在数组里面的变量抽取,,初学shell编程很多细节不太会,朋友教教我 解决方案 function random() { min=$1; max=$2-$1; num=$(date +%s+%N); echo(num%max+min); } 假设数组长n,先使用random 0 n获得一个随机数a,然后数组[a]就是随机抽的变量 解决方案二: 可以给我讲解下不?不太看得懂,基础太差了

【SHELL 编程基础第一部分】第一个SHELL脚本HELLOSHELL及一些简单的SHELL基础书写与概念;

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/shell/759.html 本章节分享Shell 学习篇,那么对于Shell 简单介绍下,对于Shell来说,大家可以理解Shell 是一个命令解释器,类似于DOS下的command.com.它接收用户命令(如ls等),然后调用相应的应用程序.另外一点它可以使用用户的缺省凭证和环境执行 shell.传统意义上的shell指的是命令行式的sh