从文件中获取输入并将其存储在Shell脚本的diffrent变量中

时间:2019-01-23 07:25:32

标签: bash shell file sh

我有一个问题,我想从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

我想从文件中获取输入并执行任务。那有可能然后让我知道吗?

1 个答案:

答案 0 :(得分:1)

如果您只想将test.js中包含的值读入脚本中的单独变量中,则可以省去很多麻烦,只需使用mapfilereadarray(它们是同义)以将文件的每一行读入数组的单独元素。内建函数从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