【问题标题】:Use key/value data from a file in a shell script在 shell 脚本中使用文件中的键/值数据
【发布时间】:2019-05-02 04:00:03
【问题描述】:

我有一个名为 Year.txt 的文件

Year2000= 1/2/3/4/
Year2001= 5/6/7/8/
Year2002= 9/10/11/12/
....
....
....
Year2020= 100/101/102/

等等

我需要将此 Year.txt 作为我的另一个脚本中的参考一些 sample.sh

sample.sh

source /home/user/Year.txt
d=cp $filename $1
echo $d

sample.sh Year2000(将 Year2000 作为第一个参数传递)

**如果我将 Year2000 作为参数传递,我需要剪切 = 之后的第二部分并将 1/2/3/4/ 粘贴到我的语句中

**如果我将 Year2001 作为参数传递,我需要在 = 之后剪切第二部分,并将 5/6/7/8/ 粘贴到我的复制语句中 等等。

我需要这样的输出:

Input1 sample.sh Year2000

输出:cp somefile.txt 1/2/3/4/

输入2:sample.sh Year2001

输出:cp somefile.txt 5/6/7/8/

简而言之——我需要从另一个文件中获取引用并生成复制语句

【问题讨论】:

  • 你的输入文件在=之后真的有空格吗?如果是这样,这不是一个合法的 bash 分配,所以你不能source它。
  • 您的目标是哪个外壳? 真的需要/bin/sh,还是可以使用bash? (关联数组非常适合手头的问题)。由于source 不是合法的 POSIX sh 语句,听起来您可能已经在 bash 上进行测试了。
  • 我们可以用任何分隔符更改输入文件,| , 双引号任何东西。但我需要副本声明应该准备好。不强制使用 =
  • 回声 $0 -bash 。没关系。
  • 确实很重要。如果您以 sh 的名称运行 Bash,它将禁用功能;它必须bash 调用,以使完整的扩展语言可用。

标签: bash


【解决方案1】:

不要source 不是合法 bash 代码的文件。在这种情况下,关联数组允许您在单个变量中存储任意数量的键/值对。

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Needs bash 4.0 or newer" >&2; exit 1;; esac

year_name=$1
file_name=$2

[[ $file_name ]] || { echo "Usage: $0 year-name file-name" >&2; exit 1; }

# Read year.txt, and generate a map
declare -A dirs_by_year=( )
while IFS='= ' read -r k v; do
  dirs_by_year[$k]=$v
done <Year.txt

if ! [[ ${dirs_by_year[$year_name]} ]]; then
  echo "ERROR: User specified year $1, but input file does not have a directory for it" >&2
  echo "       ...defined years follow:" >&2
  declare -p dirs_by_year >&2  # print array definition to show what we read
  exit 1
fi

# generate and write a cp command
printf '%q ' cp "$file_name" "${dirs_by_year[$year_name]}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2017-12-26
    • 2017-09-01
    • 1970-01-01
    相关资源
    最近更新 更多