如何将命令行参数传递给文件

如何将命令行参数传递给文件

我有一个文本文件,我想将命令行参数传递到其中。例如:

./scriptname.sh abc.sh 

scriptname.sh我可以在里面写入复制abc.sh到文本文件的命令是什么new.txt

答案1

类似伯恩的贝壳

在类似 Bourne 的 shell 中(正如您的.sh扩展建议您在脚本中使用的那样):

#! /bin/sh -
if [ "$#" -gt 0 ]; then # if I was given at least 1 argument
  cp -- "$1" new.txt # where $1 is the first argument... $9 the 9th
                     # and ${10} the 10th (not $10 which is ${1}0)
else
  echo >&2 Not given enough arguments
  exit 1
fi

(请注意,需要--标记选项的结尾,以确保不会被视为以 开头的$1选项)。cp-

检查是否至少给出了一个参数的一种更简短的方法是:

#! /bin/sh -
cp -- "${1?Not given enough arguments}" new.txt

哪里${parameter?message}导致 shell 退出并出现错误,包括信息如果没有设置该参数。

或者如果你真的很懒:

#! /bin/sh -u
cp -- "$1" new.txt

哪里-u导致 shell 退出任何未设置参数的参数扩展。

复制全部论据:

#! /bin/sh -
if [ "$#" -gt 0 ]; then # if I was given at least 1 argument
  cp -- "$@" /some/dir/ # where "$@" expands to all the script's
                        # arguments as separate arguments to cp
else
  echo >&2 Not given enough arguments
  exit 1
fi

(可移植的是,如果没有参数,您不能依赖${@?...}或退出脚本)。-u

要循环参数,这就是for构造默认循环的内容:

#! /bin/sh -
for file do
  cp -- "$file" "$file.new"
done

当然你也可以这样做:

#! /bin/sh -
for file in "$@" do
  cp -- "$file" "$file.new"
done

使其明确(但在某些 shell 中效率较低)。

其他贝壳

(将 arg 计数检查放在一边)

  • csh/tcsh

    cp -- $1:q new.txt # one argument, properly quoted
    cp -- $argv:q /some/dir # all arguments
    
  • rc/ es

    cp -- $1 new.txt
    cp -- $* /some/dir
    
  • fish

    cp -- $argv[1] new.txt
    cp -- $argv /some/dir
    

相关内容