开发者

UNIX command line argument referencing issues

I'm trying to tell unix to print out the command line arguments passed to a Bourne Shell script, but it's not working. I get the value of x at the echo statement, and 开发者_JAVA百科not the command line argument at the desired location.

This is what I want:

./run a b c d

a b c d

this is what I get:

1 2 3 4

What's going on? I know that UNIX is confused as per what I'm referencing in the shell script (the variable x or the command line argument at the x'th position". How can I clarify what I mean?

#!/bin/sh
x=1
until [ $x -gt $# ]
do
echo $x
x=`expr $x + 1`
done

EDIT: Thank you all for the responses, but now I have another question; what if you wanted to start counting not at the first argument, but at the second, or third? So, what would I do to tell UNIX to process elements starting at the second position, and ignore the first?


echo $*

$x is not the xth argument. It's the variable x, and expr $x+1 is like x++ in other languages.


The simplest change to your script to make it do what you asked is this:

#!/bin/sh
x=1
until [ $x -gt $# ]
do
    eval "echo \${$x}"
    x=`expr $x + 1`
done

HOWEVER (and this is a big however), using eval (especially on user input) is a huge security problem. A better way is to use shift and the first positional argument variable like this:

#!/bin/sh

while [ $# -gt 0 ]; do
    x=$1
    shift
    echo ${x}
done


If you want to start counting a the 2nd argument

for i in ${@:2}
do
  echo $i
done


A solution not using shift:

#!/bin/sh

for arg in "$@"; do
  printf "%s " "$arg"
done
echo
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜