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