为什么我要在shell脚本中使用声明/排版而不是X = y?

乔福克

我最近遇到了一个shell脚本,declare -- FOO=""脚本显然是typeset -- FOO=""在非bash shell中拼写的

为什么我要做到这一点,而不是普通的FOO=""export FOO

查尔斯·达菲

使用的最重要目的declare是控制范围,或使用其他方式无法访问的数组类型。


使用函数局部变量

举个例子:

print_dashes() { for (( i=0; i<10; i++; do printf '-'; done; echo; }

while read -p "Enter a number: " i; do
  print_dashes
  echo "You entered: $i"
done

您希望打印出用户输入的号码,对吗?但是,相反,它会始终打印的值iprint_dashes叶子它完成时。

请考虑:

print_dashes() {
  declare i  # ''local i'' would also have the desired effect
  for (( i=0; i<10; i++; do printf '-'; done; echo;
}

...现在ilocal,因此新分配的值不会超出其调用范围。


明确声明全局变量

相反,有时您需要声明一个全局变量,并通过意图向代码读者清楚地表明您正在执行此操作,或者同时将某些内容声明为数组(否则declare将隐式指定全局状态) 。你也能做到:

myfunc() {
  declare arg                     # make arg local
  declare -g -A myfunc_args_seen  # make myfunc_args_seen a global associative array
  for arg; do
    myfunc_args_seen["$arg"]=1
  done

  echo "Across all invocations of myfunc, we have seen the following arguments:"
  printf ' - %q\n' "${!myfunc_args_seen[@]}"
}

声明关联数组

普通的shell数组只能被分配:my_arr=( one two three )

但是,对于关联数组(键为字符串)则不是这种情况对于这些,您需要声明它们:

declare -A my_arr=( ["one"]=1 ["two"]=2 ["three"]=3 )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我应该使用(y,x)而不是(x,y)访问opencv中的像素?

为什么我在 python 中使用 x,y = y,x 超出范围

x,y = y,y + x和x = y,y = x + y之间有什么区别?

为什么在Python中x * = y比x = x * y慢?

在 python 中使用 (x%y)

我可以做x = y = z。在C ++中为什么不允许x <y <z?

为什么`x && y`不被解析为`x&(&y)`?

javascript .map(x => x && y); 为什么结果y

为什么变量 y 是 0,不是 2?

为什么当我在roc_auc评分中使用GridSearchCV时,grid_search.score(X,y)和roc_auc_score(y,y_predict)的分数不同?

为什么我在使用gotoxy(x,y)时无法打印第一列

if(x!= y)和if(x == y)

类型(x,y)与(x / = y)

什么是 x, y = func(x, y)

我可以在(x,y,z)中使用select吗?

使用双打时,为什么(x /(y * z))与(x / y / z)不同?

为什么使用meshgrid时我的y轴会反转?

为什么在python 3.8中sqrt(x * x + y * y)!= math.hypot(x,y)?

为什么(x-(x / y)* y)与x%y的值相同?

如何使用“ x <= y && x> = y && x!= y”使循环无限?

为什么IComparer要求您定义IComparer.Compare(Object x,Object y)而不是Compare(Object x,Object y)?

为什么int x {y = 5}是可能的?

如何声明QPoint(x,y)

我需要在HTML中将X写入Y的幂(Y是X的上标)

在Python中使用slice(x,y)函数

X不是Y的成员类型

为什么geom_bar条来自y轴而不是x轴?

多个关系(比较)运算符:为什么x <y> z不是有效的语法?

Unity2D-为什么对象绕X / Y轴而不是Z旋转