【问题标题】:Dealing with program argument and a variable in bash在 bash 中处理程序参数和变量
【发布时间】:2021-04-14 06:11:25
【问题描述】:

我有以下一组 shell 变量。

var0=000
var1=111
var2=222
var3=333

我想要另一个变量 var 由用户的 cli 参数 ($1) 确定 在执行期间指向上述变量之一(var0 to var3)。

CLI 参数以下列方式传递给脚本 ./script.sh 1

# === script.sh ===
k="$1"
var=var$k
echo $var

但是$var 在输出中是空的。

【问题讨论】:

  • 请指定您的意思是 user input 使用 readpositional arguments 派生,这些参数位于脚本的 cli 调用的末尾,即 @987654329 @ 在终端中。如果可能,分享整个脚本源代码。
  • 由于 k 设置为 1(在您的调用中),var 的值为 var1,并且 echo 语句应输出字符串 var1。我在您的代码中没有看到任何“用户输入选择”。
  • @user193442,用户输入在脚本cli调用的最后,比如./script.sh 0
  • 这通常不称为用户输入,而是传递程序参数传递程序参数,或者,正如kevinnls 所说,位置参数。如果你谈论用户输入,我们认为你想摆弄 /dev/tty,或者至少做一个read 命令或类似的东西。
  • 我看不出 var 怎么可能是空的。即使$k 有问题,$var 至少应该包含文字var 可以分享一下你得到的输出吗?

标签: bash variables


【解决方案1】:

我不明白 var 怎么可能是空的。即使$k有问题,$var至少应该包含文字字符串var
你能分享一下你得到的输出吗?

尽管如此,我假设您正试图从$var 间接 访问$var1 的值,解决方案如下:

echo "${!var}"

注意:您需要确保$1 不为空或无效(字符串或>3 或$1 为空,请考虑使用大括号扩展来使用默认值 - ${1:-'1'}

说明

${!var} 语法以这种方式执行间接扩展(对于给定的代码)

  1. 假设命令是./script.sh 1
  2. var 扩展为它的值 - var1
  3. 变量var1的值扩展为111

替代方案 - 可能更好

或者,(也许更有效)您可以将数组用作suggested by @KamilCuk in their answer,将其修改为使用${var[$1]},而不是读取用户输入。

【讨论】:

  • 另外,您应该双引号引用变量引用(例如 echo "${!var}" 而不仅仅是 echo ${!var})。
【解决方案2】:

只使用一个数组。

var=(000 111 222 333)
read k
echo "${var[k]}"

【讨论】:

  • OP 表示位置参数。不是用户输入。请考虑适当修改您的答案
猜你喜欢
  • 2016-06-20
  • 2015-10-27
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
相关资源
最近更新 更多