Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 显示加载了shell变量的文件内容_Linux_Bash_Shell - Fatal编程技术网

Linux 显示加载了shell变量的文件内容

Linux 显示加载了shell变量的文件内容,linux,bash,shell,Linux,Bash,Shell,我知道sed可以帮助替换文件中的字符串 我是否可以在不使用sed的情况下显示加载了shell变量的文件内容 就我的情况而言,我有一个文件,其中的变量为/tmp/my_vars,示例: VAR_DIR="/etc/my_conf" VAR_FILE_A="fileA" File A is located in $VAR_DIR/$VAR_FILE_A . 作为/tmp/my_模板编制的模板,样本: VAR_DIR="/etc/my_conf" VAR_FILE_A="fileA" File

我知道
sed
可以帮助替换文件中的字符串

我是否可以在不使用sed的情况下显示加载了shell变量的文件内容

就我的情况而言,我有一个文件,其中的变量为
/tmp/my_vars
,示例:

VAR_DIR="/etc/my_conf"
VAR_FILE_A="fileA"
File A is located in $VAR_DIR/$VAR_FILE_A .
作为
/tmp/my_模板编制的模板
,样本:

VAR_DIR="/etc/my_conf"
VAR_FILE_A="fileA"
File A is located in $VAR_DIR/$VAR_FILE_A .
我执行了一个bash脚本(用于加载变量):

我想知道我是否可以在脚本中放置一个简单的命令,如下所示:

File A is located in /etc/my_conf/fileA .
无论如何,感谢您的帮助。

纯shell解决方案(不推荐) 这种方法的问题是,它对文件
/tmp/my_模板
中的任何内容运行
eval
。那是可能的

awk解决方案(推荐) awk是一个很好的工具:

$ awk -F'[="]+' 'FNR==NR{a["[$]"$1]=$2;next} {for (i in a) gsub(i,a[i]);} 1' /tmp/my_vars /tmp/my_template
File A is located in /etc/my_conf/fileA .
工作原理 这将首先读入
/tmp/my_vars
,收集所有替换信息。然后它读入
/tmp/my_template
,一次替换一行

  • -F'[=”]+'

    这告诉awk使用
    =
    的任意组合作为字段分隔符

  • FNR==NR{a[“[$]”“$1]=$2;next}

    当我们在第一个文件上时,即当
    FNR==NR
    时,我们为每行的数组
    a
    添加一个条目,第一个字段作为键,第二个字段作为值

    在键字符串的开头添加一个美元符号。因为
    $
    是一个活动的正则表达式字符,所以我们将它放在方括号内,
    [$]
    以便将其视为常规字符

  • 对于(a中的i)gsub(i,a[i])

    对于
    a
    中的每个键,执行替换。当前行中出现键
    i
    的每个位置都会被值
    a[i]
    替换

  • 1

    这会打印线条

多行格式化 对于喜欢将代码分散在多行的用户:

awk -F'[="]+' '
FNR==NR{
    a["[$]"$1]=$2
    next
}

{
    for (i in a) gsub(i,a[i])
}

1
纯壳牌解决方案(不推荐) 这种方法的问题是,它对文件
/tmp/my_模板
中的任何内容运行
eval
。那是可能的

awk解决方案(推荐) awk是一个很好的工具:

$ awk -F'[="]+' 'FNR==NR{a["[$]"$1]=$2;next} {for (i in a) gsub(i,a[i]);} 1' /tmp/my_vars /tmp/my_template
File A is located in /etc/my_conf/fileA .
工作原理 这将首先读入
/tmp/my_vars
,收集所有替换信息。然后它读入
/tmp/my_template
,一次替换一行

  • -F'[=”]+'

    这告诉awk使用
    =
    的任意组合作为字段分隔符

  • FNR==NR{a[“[$]”“$1]=$2;next}

    当我们在第一个文件上时,即当
    FNR==NR
    时,我们为每行的数组
    a
    添加一个条目,第一个字段作为键,第二个字段作为值

    在键字符串的开头添加一个美元符号。因为
    $
    是一个活动的正则表达式字符,所以我们将它放在方括号内,
    [$]
    以便将其视为常规字符

  • 对于(a中的i)gsub(i,a[i])

    对于
    a
    中的每个键,执行替换。当前行中出现键
    i
    的每个位置都会被值
    a[i]
    替换

  • 1

    这会打印线条

多行格式化 对于喜欢将代码分散在多行的用户:

awk -F'[="]+' '
FNR==NR{
    a["[$]"$1]=$2
    next
}

{
    for (i in a) gsub(i,a[i])
}

1

如果您希望加载
my_vars
的过程打印出从该文件加载的所有变量,您可以将以下内容添加到
my_vars
的底部:

# Permit extended notation for parameter expansion
shopt -s extglob

# Step through the file, printing lines that look like variable assignments
while read line; do
  case "$line" in
    +([A-Z_])=*)
      var="${line%%=*}"
      eval "echo \"Variable '$var' is set to '\$$var'\""
      ;;
  esac
done < $BASH_SOURCE

与加载文件时希望查看其内容的任何其他变量的类似行一起。

如果希望加载
my\u vars
的过程打印出从该文件加载的所有变量,可以将以下内容添加到
my\u vars
的底部:

# Permit extended notation for parameter expansion
shopt -s extglob

# Step through the file, printing lines that look like variable assignments
while read line; do
  case "$line" in
    +([A-Z_])=*)
      var="${line%%=*}"
      eval "echo \"Variable '$var' is set to '\$$var'\""
      ;;
  esac
done < $BASH_SOURCE

以及您希望在加载文件时看到其内容的任何其他变量的类似行。

VAR\u file\u A
add
echo下,“文件A位于${VAR\u DIR}/${VAR\u file\u A}”
取决于您对“简单”的定义。Bash并不是开箱即用的。数据文件不是Bash代码,反之亦然。你可以做一些事情,虽然这并不困难,但你似乎寻找的行为并不是Bash的一个特性。在
VAR\u文件a
add
echo“文件a位于${VAR\u DIR}/${VAR\u文件a}”下,
取决于你对“简单”的定义。Bash并不是开箱即用的。数据文件不是Bash代码,反之亦然。您可以做一些事情,但您似乎正在寻找的行为也不是Bash.looks的功能way@JarrodRoberson你这是什么意思?是因为你不喜欢awk吗?或者,什么?看起来像线噪音way@JarrodRoberson你这是什么意思?是因为你不喜欢awk吗?还是怎样