Questions tagged «variable»

变量是一个名称,如果正确地选择了具有符号含义的名称,则会包含一个或多个值。如果您的问题是特定于在shell脚本中使用变量的,请使用此标记(如果要询问编程语言中的变量,则可能应该在StackOverflow上询问)

2
如何在包含“”的字符串中插入变量?
我想通过插入变量来构造一个xml字符串: str1="Hello" str2="world" xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>' echo $xml 结果应该是 <?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2> 但是我得到的是: <?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2> 我也试过 xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>" 但这会删除内部的双引号,并给出: <?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
25 bash  shell  variable  xml 



5
为什么在[[]]测试中使用双引号?
假设我们在bash脚本中有2个整数: value1=5 value2=3 那为什么要在测试中使用双引号呢?例如: if [[ "$value1" -eq "$value2" ]] 为什么不只使用以下内容? if [[ $value1 -eq $value2 ]] 对我来说,双引号没有任何意义。
23 bash  shell  quoting  variable  test 


3
如果为空,如何将带引号的变量扩展为空?
假设我有一个脚本正在执行: some-command "$var1" "$var2" ... 而且,在var1为空的情况下,我希望将其替换为空字符串而不是空字符串,以便执行的命令为: some-command "$var2" ... 并不是: some-command '' "$var2" ... 有没有比测试变量并有条件地包含它更简单的方法了? if [ -n "$1" ]; then some-command "$var1" "$var2" ... # or some variant using arrays to build the command # args+=("$var1") else some-command "$var2" ... fi 在bash,zsh等中,是否有参数替换无法扩展为空?我可能仍想在其余参数中使用globing,因此禁用该选项并取消引用该变量不是一种选择。

2
以空合并方式设置shell变量
我真的很喜欢“空合并”,您可以在其中将变量设置为事物列表中的第一个“非空”值。许多语言都支持此功能,例如: C#: String myStr = string1 ?? string2 ?? "default"; JavaScript: var myStr = string1 || string2 || "default"; ...等等。我只是好奇是否可以在Bash中设置变量? 伪: MY_STR=$ENV{VAR_NAME}??$ANOTHER_VAR??"default";
20 bash  shell  variable 

4
dirname和basename与参数扩展
是否有客观原因偏爱一种形式?性能,可靠性,可移植性? filename=/some/long/path/to/a_file parentdir_v1="${filename%/*}" parentdir_v2="$(dirname "$filename")" basename_v1="${filename##*/}" basename_v2="$(basename "$filename")" echo "$parentdir_v1" echo "$parentdir_v2" echo "$basename_v1" echo "$basename_v2" 产生: /some/long/path/to /some/long/path/to a_file a_file (v1使用外壳程序参数扩展,v2使用外部二进制文件。)

4
转义变量以用作另一个脚本的内容
这个问题与如何编写正确转义​​的字符串文字无关。我找不到任何有关如何转义变量以直接在脚本或其他程序中使用的相关问题。 我的目标是使一个脚本能够生成其他脚本。这是因为生成的脚本中的任务将在另一台计算机上运行0到n次,并且生成它们的数据可能会在运行之前(再次)更改,因此直接通过网络进行操作将不行。 给定一个可能包含特殊字符(例如单引号)的已知变量,我需要将其写为完全转义的字符串文字,例如,一个foo包含的变量bar'baz应在生成的脚本中显示为: qux='bar'\''baz' 通过附加"qux=$foo_esc"到脚本的其他行来编写。我是这样用Perl做到的: foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'" 但这似乎太过分了。 我仅靠bash并没有取得成功。我尝试了这些的许多变体: foo_esc="'${file//\'/\'\\\'\'}'" foo_esc="'${file//\'/'\\''}'" 但是要么多余的斜杠出现在输出中(当我这样做时echo "$foo"),否则它们会导致语法错误(如果从shell进行操作,则需要进一步的输入)。


5
管道分配变量
为了简单起见,我想这样做: echo cart | assign spo; echo $spo 输出:购物车 是否assign存在这样的应用程序? 我知道使用替代的所有方法。
19 bash  variable 

3
使用Shell变量获取命令选项
在Bash脚本中,我试图将要使用的选项存储rsync在单独的变量中。这对于简单的选项(例如--recursive)来说效果很好,但是我遇到了--exclude='.*'以下问题: $ find source source source/.bar source/foo $ rsync -rnv --exclude='.*' source/ dest sending incremental file list foo sent 57 bytes received 19 bytes 152.00 bytes/sec total size is 0 speedup is 0.00 (DRY RUN) $ RSYNC_OPTIONS="-rnv --exclude='.*'" $ rsync $RSYNC_OPTIONS source/ dest sending incremental file list .bar foo sent …
19 bash  variable 

1
为什么$ {$#}在shell中返回与$$相同的结果?
在尝试设置最后一个位置参数时/bin/dash,我已经尝试过了echo ${$#}。出人意料的是,这不会导致错误,但会导致PID与$$变量内容相同。问题,为什么该语法起作用?shell在这里应用的语法规则是什么? 基本上,我所做的是 $ set 1 2 3 4 5 $ echo ${$#} 13819 $ echo $$ 13819 显然,%在这种结构中字符也被忽略 $ echo ${$%} 13819 但是*并@导致不良的替换错误: $ echo ${$*} sh: 10: Bad substitution $ echo ${$@} sh: 11: Bad substitution
18 shell  variable 

3
为什么带引号的变量中的选项会失败,但不带引号的情况下会起作用?
我了解到我应该在bash中引用变量,例如“ $ foo”而不是$ foo。但是,在编写脚本时,我发现了一种情况,它不带引号但不带引号就可以工作: wget_options='--mirror --no-host-directories' local_root="$1" # ./testdir recieved from command line remote_root="$2" # ftp://XXX recieved from command line relative_path="$3" # /XXX received from command line 这个作品: wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path" 这个不会(注意$ wget_options周围的双引号): wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path" 这是什么原因呢? 第一行是好的版本;还是我应该怀疑某个地方存在隐藏的错误导致此行为? 通常,在哪里可以找到好的文档来了解bash及其引用的工作原理?在编写此脚本期间,我觉得我开始在反复试验的基础上工作,而不是理解规则。

6
执行时是否应将变量加引号?
Shell脚本编写的一般规则是,除非有明显的理由,否则应始终对变量加引号。要获得比您可能想知道的更多的详细信息,请查看以下精彩问答:忘记在bash / POSIX shell中引用变量的安全隐患。 但是,请考虑以下功能: run_this(){ $@ } 是否应该$@在那儿引用?我玩了一段时间,找不到引号不足引起问题的情况。另一方面,使用引号会使传递包含空格作为引号变量的命令时中断: #!/usr/bin/sh set -x run_this(){ $@ } run_that(){ "$@" } comm="ls -l" run_this "$comm" run_that "$comm" 运行上面的脚本将返回: $ a.sh + comm='ls -l' + run_this 'ls -l' + ls -l total 8 -rw-r--r-- 1 terdon users 0 Dec 22 12:58 da -rw-r--r-- 1 …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.