所以我有一个问题。我设法使它在下面工作。
main () {
file="$1"
if [ ! -e "$file" ]; then echo "$2" > $1; fi
}
main /var/store/traefik.provider NOT-SET
main /var/store/server.email NOT-SET
main /var/store/traefik.domain NOT-SET
main /var/store/tld.program NOT-SET
# Recall Variables - tld - provider - domain - email
provider=$(cat /var/store/traefik.provider)
tld=$(cat /var/store/tld.program)
domain=$(cat /var/store/traefik.domain)
email=$(cat /var/store/server.email)
实际上,我正试图通过添加$ 3来使代码像这样工作。我遇到的问题是我无法将变量存储到$ 3中。我得到:
provider=NOT-SET: command not found
正如您在下面看到的,我正试图调出一个变量并将其存储到$ 3中,这样它就不会太长。你有什么建议吗?
main () {
file="$1"
if [ ! -e "$file" ]; then echo "$2" > $1; fi
$3=(cat $2)
}
main /var/store/traefik.provider NOT-SET provider
main /var/store/server.email NOT-SET email
main /var/store/traefik.domain NOT-SET domain
main /var/store/tld.program NOT-SET program
答案 0 :(得分:3)
假设您确实要使用NOT-SET
创建文件,请尝试以下方法之一:
main() {
local file=$1 val=$2 var=$3
[[ -e $file ]] || printf '%s\n' "$val" > "$file"
printf -v "$var" '%s' "$(<"$file")"
}
main /var/store/traefik.provider NOT-SET provider
main() {
local file=$1 val=$2
[[ -e $file ]] || printf '%s\n' "$val" > "$file"
cat "$file"
}
provider=$(main /var/store/traefik.provider NOT-SET)
答案 1 :(得分:1)
$3=(cat $2)
这是无效的。这是错误的语法。请参阅,=
之前的部分被解释为变量名称,并且未展开。变量名不能以$
开头。
对于您的问题,可能有很多解决方案,使用eval的不良解决方案和使用其他技术的好的解决方案。
获取一个好的解决方案:
main() {
declare -n ref="$3"
if [ ! -e "$1" ]; then
echo "$2" > "$1";
ref=$2
fi
}
现在魔术已在-n
中切换到declare
命令。来自declare --help
:
-n make NAME a reference to the variable named by its value
因此,这里发生的情况是,bash将变量值解释为对其他变量的引用。因此,ref=$2
自动将变量名$3
设置为$2
的值。
让我们做一个不好的解决方案:
main() {
if [ ! -e "$1" ]; then
echo "$2" > "$1";
eval "$3=\$2"
fi
}
让我们记住eval
是evil。这里发生的是,"$3=\$2"
被双重评估了,一旦传递给eval
,它就变成了<the string behind $3>=$2
,然后它第二次被设置了变量。
答案 2 :(得分:1)
您只需要一种方法来修复语法。尽管可以使用eval
,但您可以 使用printf -v
。
$: cat settst
#! /bin/bash
(( $# )) || { echo $0 var val; exit 1; }
setting() {
eval $1=$2
printf -v "$2" "%s" "$1"
}
setting $1 $2
set|grep $1=$2
set|grep $2=$1
$: settst foo bar
foo=bar
bar=foo
$: settst x y
x=y
y=x
$3=...
通常不是有效的语法。通过使用eval
成为$ 3的值,后跟=,如果$ 3的值是有效的变量名,则这将是有效的赋值。另一方面,printf -v
将值显式写入名为的变量。
使用提供的printf -v "$var" '%s' "$(<"$file")"
语法mickp,但是eval 将起作用。最终它会再次咬住你。
答案 3 :(得分:0)
Animated.ScrollView
是脚本上下文中的第三个位置参数,是用于调用脚本的第三个参数,在函数中是第三个参数。
两个选项:
$3
外部的逻辑起作用,以向main
添加第三个参数main
设置参数set
注意:分配了set -- "$1" "$2" "$(<"$2")"
的{{1}}变量不再使用file
而是使用$1
$1