使用函数将输出存储到变量中

时间:2018-11-08 11:51:19

标签: bash

所以我有一个问题。我设法使它在下面工作。

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

4 个答案:

答案 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
}

让我们记住evalevil。这里发生的是,"$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