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
三种变体:
将内容作为命令行参数传递:
$ ./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. 然而,它确实为脚本用户提供了很大的灵活性,可以从文件或管道传递标准输入数据。
使用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)