问题标签 [variable-expansion]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
331 浏览

linux - 展开 bash 变量,但不展开它包含的变量

我需要能够将变量扩展为它的声明字符串,而不是像通常那样在其声明中扩展其他变量。

我需要一个导致:“ this variable contains a $variable” ...而不是:“ this variable contains a word”的命令

变量声明必须保持不变,因为它需要在所有其他情况下正常展开。所以我不能在声明中使用单引号。

0 投票
1 回答
348 浏览

linux - 仅当先前未声明 bash 变量时才为它们设置默认值

这是我目前的流程:

我正在寻找的核心功能是设置一个不会覆盖先前声明的变量的默认变量列表。

上面的代码做到了这一点,但它也造成了这些变量现在不能相互依赖的问题。这是因为关联数组的索引输出"${!var[@]}"的顺序并不总是与它们声明的顺序相同。

是否存在更简单的解决方案,例如:

我还没有找到类似的东西。

另外,我知道这可以通过 if 语句来完成。但是,使用一堆 if 语句会破坏具有近 100 个默认变量的脚本的可读性。

0 投票
2 回答
1174 浏览

linux - Bash 脚本:不使用 $@ 或 $* 扩展参数

使用$@您可以对 bash 中的文件列表执行操作。例子:

脚本.sh:

然后我可以调用这个程序

该参数将扩展为多个参数,变为$list. 但现在我想要其他参数,比如 1 美元、2 美元,而这个清单是 3 美元。所以我希望在dir1/{subdir1/*.dat,subdir2/*}脚本内部进行扩展,而不是成为许多参数。在命令行上,您可以这样做:

并获得所需的输出,即文件列表。所以我尝试了这样的事情:

调用:

但没有成功。非常感谢有关如何将此列表扩展为脚本内的变量的一些帮助!:)

编辑:所以下面的答案给出了使用这些命令的解决方案:

但是出于好奇,是否仍然可以将字符串传递dir1/{subdir1/*.dat,subdir2/*}find脚本内的命令(或任何具有相同目的的命令),而不使用$@, 并以这种方式获取列表?这可能很有用,例如,如果最好将列表作为不是第一个或最后一个参数,或者在某些其他情况下,即使它需要转义字符或引用参数。

0 投票
1 回答
206 浏览

bash - 在替代值扩展中使用字符串作为 bash 变量名

如何在 bash中的替代值扩展( ${var+alt})中使用一个变量的值作为另一个变量的名称?

我会认为

应该大致相当于

但是当我尝试这样做时,我得到

我想部分问题是执行命令替换的子shell不再知道$varname了?我需要导出该变量吗?

我这样做的原因是我从这个答案中学到了如何检查变量是否为空,并且我试图将该检查封装在一个名为 的函数中is_null,如下所示:

0 投票
1 回答
109 浏览

shell - zsh 重定向,连同参数扩展

我正在编写一个调用程序 P 的 shell 脚本 S。

P 只接受来自标准输入的输入。

我的脚本 S 的参数之一是可选的;如果参数存在,它表示一个文件,它应该被输入到 P 中。如果参数缺失,S 的标准输入应该被输入到 P 中。

这是我尝试解决的问题:

这个想法是:如果(3rd)参数是一个文件名,比如说:foo,它应该执行

但如果它丢失或为空,它应该执行

据我了解,这应该等同于简单地

即从标准输入读取。然而,这不起作用。在字面上使用 <&0 时,有效,如

当以我在脚本中执行的方式使用时,它将产生错误消息no such file or directory: &0 。这让我感到惊讶,因为我从 zsh 手册页中了解到,参数扩展发生在设置重定向之前。

当然我可以使用这个技巧

但这看起来不是很优雅。

有人可以向我解释一下,为什么我的方法不起作用,在这里使用什么好的成语?

0 投票
1 回答
954 浏览

macos - 如何在 Mac OSX 终端中将 ls -1 扩展为变量

在 Mac OS X 终端中使用 bash shell,我想将当前目录中的所有文件名放入一个变量中,每行一个名称(基本上是 ls -1 的输出)。但是,如果我这样做:

变量 'var' 包含所有文件名,但在一行中,用空格分隔。我怎样才能解决这个问题并得到我想要的。更一般地说,这种行为的原因是什么?ls -1 扩容过程中发生了什么?

我意识到我可以通过执行以下操作将我想要的内容放入文件中,但我宁愿使用变量来实现相同的结果。

提前致谢。

0 投票
1 回答
49 浏览

bash - shell:如何在这个 Grep 结构中使用 UDV 而不会出现问题?

我有一个任务要求我在屏幕上打印比给定数字长的单词数,比如说 k ,它是从键盘读取的。然后订购结果。直到现在我决定以这种方式尝试:

我的问题是,每当我在“egrep -o '[^ ]{k,}'”部分中使用 k 尝试这个程序时,它总是给出错误的答案。但是如果我用一个整数替换它,就可以完全按照我的意愿工作。使此代码适用于从键盘读取的 k 的正确方法是什么?这是语法,无法真正理解我应该如何写在那里,尝试了其他方式来喜欢 "$k" , $k , ((k)) ,k。欢迎任何帮助,如果有人可以给我一个提示吗?我被困住了

0 投票
2 回答
818 浏览

mysql - Getting "Access denied" with perl dbi when password is read from a file

I am trying to write a simple perl script to pull the full contents of a table from a MySQL database using DBI.

I want to not have to put the database password in the script, so I'd like to set a password variable that reads from a file that contains the password.

I've got the script set up so that the three DBI parameters (DSN, user and pass) are variables. When I explicitly specify the password in the script, it works. When I have it read the file, it fails.

I even built in a small test to echo the $pass variable before calling DBI and that works great. It shows me the right password.

I'm certain that I'm doing something dumb. Help?

The environment:


~/mysql$ uname -a

~/mysql$ perl --version

~/mysql$ mysql -u phpuser -pcat ./phpuser.auth barret_test -e "status;"


As you can see, using command expansion in the mysql statement for the password is functional.

The script (yes, parts of it are inelegant. That'll be fixed later):

Running it returns:

~/mysql$ perl user_list.pl

If I change line 9 from

to

This happens:

~/mysql$ perl user_list.pl

I've Googled around and searched here, didn't see anything that seemed to cover my use case. I tried wrapping the $pass inside the DBI call in single and double quotes, no changes.

0 投票
1 回答
225 浏览

bash - 子壳中的壳分裂

我对 Shell 和 subshel​​l 中的分词不清楚。

例子:

$file_name在子shell中分裂吗?还是我必须像这样双引号:

经过一番测试,我发现:

  • 如果我设置IFS=" "$file_name则被空格分割
  • 如果IFS=""然后将整体$file_name作为第一个参数传递。

到目前为止,ksh、dash 和 bash 都显示了这种行为。

0 投票
2 回答
466 浏览

perl - 如何在 perl 系统功能中同时使用管道并防止 shell 扩展?

如果将多个参数传递给 perl 的系统函数,那么 shell 扩展将不起作用:

如果命令作为一个参数传递,则扩展将起作用:

系统功能还允许使用多个命令并使用管道连接它们。这仅在参数作为一个命令传递时才有效:

如何组合提到的命令并使用两个管道并防止外壳扩展?

我努力了:

但这不起作用,因为我上面描述的原因(多个参数没有展开)。我想要的结果是:

编辑:我实际面临的问题是当我使用以下命令时:

然后 $email_message 被扩展,如果它包含一些由 shell 进一步扩展的字符,它将破坏 mailx。