我有一个问题,我想从Shell脚本的文件中获取输入。我已经将输入存储在类似文件的行中
input.txt (File)
filename
attribute name
value
这是文件的格式,我想在代码中使用它们来使用它们
test.js
X_CLOUD_ID
100
no
#!/usr/bin/env bash
file_loop = "yes"
while [ "$file_loop" != "no" ]
do
echo 'Enter the file name'
read file
attribute_loop = "yes"
while [ "$attribute_loop" != "no" ]
do
echo 'Enter the attribute to change'
read attribute
echo 'Enter value of the attribute'
read value
sed -i 's/'$attribute':.*/'$attribute':'$value'/' $file
echo "Do you want to change in new attribute? yes/no"
read attribute_loop
done
echo "Do you want to change in new file? yes/no"
read file_loop
done
我想从文件中获取输入并执行任务。那有可能然后让我知道吗?
答案 0 :(得分:1)
如果您只想将test.js
中包含的值读入脚本中的单独变量中,则可以省去很多麻烦,只需使用mapfile
或readarray
(它们是同义)以将文件的每一行读入数组的单独元素。内建函数从stdin
读取输入,您将希望包含-t
选项,以禁止在每一行的末尾读取'\n'
作为输入的一部分。
要读取作为第一个参数(位置参数)传递给脚本的文件test.js
中的行,您只需要:
readarray -t arr < "$1"
读取输入到索引数组arr
中的行。添加一些验证,您可以执行以下操作:
#!/bin/bash
[ -r "$1" ] || {
printf "error: insufficient input.\nusage: %s file\n" "${0##*/}" >&2
exit 1;
}
declare -a arr
readarray -t arr < "$1" || {
printf "error: failed to read array from file '%s'.\n" "$1" >&2
exit 1;
}
printf "%d values read from '%s'\n" ${#arr[@]} "$1"
declare -p arr
使用/输出示例
使用文件test.js
,您将收到:
$ bash readfile.sh test.js
3 values read from 'test.js'
declare -a arr='([0]="X_CLOUD_ID" [1]="100" [2]="no")'
(注意: declare -p
仅用于转储数组的内容)
您可以在程序中随意使用arr[0], arr[1], arr[2]
。反复要求您提供文件名。仔细研究一下,如果您还有其他问题,请告诉我。
(另请注意: bash
和POSIX sh
完全不同。您没有数组,也没有readarray
或{{1} }(带有POSIX Shell)。请从您的问题中删除一个标签。您的mapfile
指定#!/usr/bin/env bash
)