将文件内容作为参数传递给 bash 脚本

Jim*_*Jim 12 bash shell-script

在 bash 脚本中,我想执行以下操作:

script.sh < some_file
Run Code Online (Sandbox Code Playgroud)

这some_file是一个有 1 行的文件,我想将它作为参数传递给我的 bash script.sh。我怎样才能做到这一点?

Kus*_*nda 11

三种变体:

  1. 在命令行上传递文件的内容,然后在脚本中使用它。
  2. 在命令行中传递文件的文件名,然后在脚本中从文件中读取。
  3. 在标准输入上传递文件的内容,然后在脚本中读取标准输入。

将内容作为命令行参数传递:

$ ./script.sh "$(<some_file)"
Run Code Online (Sandbox Code Playgroud)

脚本内部:

some_data=$1
Run Code Online (Sandbox Code Playgroud)

$1 将是第一个命令行参数的值。

如果您有太多数据,这将失败(shell 必须执行的命令会变得太大)。


传递文件名:

$ ./script.sh some_file
Run Code Online (Sandbox Code Playgroud)

脚本内部:

some_data=$(<"$1")
Run Code Online (Sandbox Code Playgroud)

或者

IFS= read -r some_data <"$1"
Run Code Online (Sandbox Code Playgroud)

将标准输入连接到文件:

$ ./script.sh <some_file
Run Code Online (Sandbox Code Playgroud)

脚本内部:

IFS= read -r some_data
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是脚本的标准输入现在连接到some_file. 然而,它确实为脚本用户提供了很大的灵活性,可以从文件或管道传递标准输入数据。


Vin*_*ary 10

cat some_file | ./script.sh `xargs` 
Run Code Online (Sandbox Code Playgroud)


And*_*ese 2

使用readshell 内置命令,您可以读取数据stdin并将读取的输入存储到 shell 变量中:

$ echo foo bar baz | read a b c
$ echo $a
foo
$ echo $b
bar
$ echo $c
baz
Run Code Online (Sandbox Code Playgroud)

如您所见,read拆分被输入到字段中。$IFS输入的分割位置由变量(输入字段分隔符)决定。通过设置$IFS为空值,输入分割被禁用,您可以将完整的行保存到一个变量中:

$ echo foo bar baz | IFS= read foo
$ echo $foo
foo bar baz
Run Code Online (Sandbox Code Playgroud)