命题参数

时间:2010-08-18 11:20:19

标签: bash

下面是我要制作的shell脚本的摘录,它应该允许 用户提供他们想要查看的文件,脚本打印第一行 每个文件并询问是否要删除它们。我已经标记了错误的位置,我知道我正在使用$不正确。

任何帮助将不胜感激 谢谢:))

count=1

while [ $# -ge $count ]

do
        head $"$count"//error here
    echo -e "Delete file $$count?? (y/n):"//error here

    read answer
    case $answer in
               Y|y)rm $"$count"//error here
                 echo -e "File $$count deleted\n" ;;//error here
               N|n)echo -e "File $$count NOT deleted\n" ;;//error here
               *)echo "Invalid Command";;
    esac            

    count=`expr $count + 1`
done

3 个答案:

答案 0 :(得分:2)

在这种情况下使用位置参数是愚蠢的,因为你不关心这个位置;只是关于它的实际价值。使用bash的$@数组:

for file in "$@"; do
    head "$file";
    read -p "Delete file \"$file\"? (Y/N) " answer;
    case "$answer" in
        Y|y) rm -v "$file";;
        N|n) echo "File \"$file\" was not deleted.";;
        *) echo 'Invalid command';;
    esac;
done;
  • 使用“$ @”代替使用$1shift搞乱。
  • 在命令中使用它们时引用的参数。
  • 指定read的提示,而不是第一次echo

答案 1 :(得分:1)

你可以这样做:

# loop till you have filenames
while [ $# -ge 1 ]
do
        # display the first 10 lines for 1st file.
        head $1

        echo -e "Delete file $1?? (y/n):"
        read answer

        case $answer in
        Y|y)rm $1
        echo -e "File $1 deleted\n" ;;

        N|n)echo -e "File $1 NOT deleted\n" ;;
        *)echo "Invalid Command";;

        esac            

        # shift the parameters.
        # you loose 1st argument, 2nd argument becomes 1st
        # $# is decremented.                                                                                                                                                                                   
        shift
done

答案 2 :(得分:0)

你似乎要做的事情被称为“间接”。您可以使用它来访问位置参数,但最好使用shift或使用janmoesen's answer中的for file

以下是间接如何工作:

#!/bin/bash
count=1
while (( count <= $# ))
do
    echo "${!count}"
    ((count++))
done

您可以在脚本中“$$ count”的位置使用${!count}

顺便说一句,正如您在我的示例中所看到的,没有必要使用expr来增加变量。