我的 .cfg bash 脚本文件中有以下几行
DDF_SOURCE="siebel_DATA_DATE_FORMAT"
DATA_DATE_FORMAT=${!DDF_SOURCE}
Run Code Online (Sandbox Code Playgroud)
${!DDF_SOURCE}如何评估?它会是!siebel_DATA_DATE_FORMAT,这对我来说没有意义。
这个问题不是关于如何编写正确转义的字符串文字。我找不到任何与如何转义变量以在脚本或其他程序中直接使用的相关问题。
我的目标是使脚本能够生成其他脚本。这是因为生成的脚本中的任务将在另一台机器上运行 0 到n次,并且生成它们的数据在运行(再次)之前可能会发生变化,因此直接通过网络执行操作将不行。
给定一个可能包含特殊字符(例如单引号)的已知变量,我需要将其写为完全转义的字符串文字,例如,foo包含的变量bar'baz应出现在生成的脚本中:
qux='bar'\''baz'
Run Code Online (Sandbox Code Playgroud)
这将通过附加"qux=$foo_esc"到其他脚本行来编写。我是这样使用 Perl 做到的:
foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
Run Code Online (Sandbox Code Playgroud)
但这似乎有点矫枉过正。
我单独使用 bash 没有成功。我已经尝试了这些的许多变体:
foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
Run Code Online (Sandbox Code Playgroud)
但是输出中会出现额外的斜杠(当我这样做时echo "$foo"),或者它们会导致语法错误(如果从 shell 完成,则需要进一步的输入)。
我确定它相对简单,我只是不知道该怎么做。
#!/usr/bin/ksh
set `iostat`
myvar=6
Run Code Online (Sandbox Code Playgroud)
我想要类似的东西echo ${$myvar},我想解释为${$myvar}-> ${6}->value
跟进此问题中的背景部分。
在bashI 可以${!FOO}用于双重替换,在zsh ${(P)FOO}. 在这两种情况下,老派(hack-y)都eval \$$FOO有效。
所以,对我来说最聪明和最合乎逻辑的事情是${${FOO}}, ${${${FOO}}}…双/三/n 替换。为什么这不能按预期工作?
二:什么是\在做eval陈述?我认为这是一种逃避,使事情eval \$$$FOO变得不可能。如何使用在每个 shell 中都有效的三重 / n 替换?
我最近在我的 cygwin 配置文件中注意到以下内容,更准确地说:
/usr/local/bin:/usr/bin${PATH:+:${PATH}}
Run Code Online (Sandbox Code Playgroud)
这是什么意思?为什么不只是 $PATH?这是“如果 $PATH 存在则添加:$PATH”吗?我的目的是交换顺序并将 cygwin 路径放在 windows 路径后面。过去我会
$PATH:/usr/local/bin:/usr/bin
Run Code Online (Sandbox Code Playgroud)
但这让我感到困惑。也许我应该做
PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
Run Code Online (Sandbox Code Playgroud)
追加 : 在 $PATH 的末尾?
为什么我$x从下面的片段中得到不同的值?
#!/bin/bash
x=1
echo fred > junk ; while read var ; do x=55 ; done < junk
echo x=$x
# x=55 .. I'd expect this result
x=1
cat junk | while read var ; do x=55 ; done
echo x=$x
# x=1 .. but why?
x=1
echo fred | while read var ; do x=55 ; done
echo x=$x
# x=1 .. but why?
Run Code Online (Sandbox Code Playgroud) 我有一个颜色变量。我用它来为字符串设置颜色,方法是在字符串内部对其进行评估。但是,我需要在名称后包含空格(以便名称不包含部分文本)。这有时看起来很糟糕。
我怎样才能避免使用(打印)这个空间?
示例(让我们说Red=1和NC=2):
echo -e "$Red Note: blabla$NC".
Run Code Online (Sandbox Code Playgroud)
输出:
1 Note: blabla2.
Run Code Online (Sandbox Code Playgroud)
预期输出:
1Note: blabla2.
Run Code Online (Sandbox Code Playgroud) 该变量BUILDNUMBER设置为值 230。我希望230_为命令打印,echo $BUILDNUMBER_但输出为空,如下所示。
# echo $BUILDNUMBER_
# echo $BUILDNUMBER
230
Run Code Online (Sandbox Code Playgroud) 我有一个名为变量descr可以包含字符串Blah: -> r1-ae0-2 / [123],-> s7-Gi0-0-1:1-US / Foo等等。我想要得到的-> r1-ae0-2,-> s7-Gi0-0-1:1-US部分从字符串。目前我用descr=$(grep -oP '\->\s*\S+' <<< "$descr"这个。有一个更好的方法吗?是否也可以通过参数扩展来做到这一点?
${!FOO}在 中执行双重替换bash,这意味着它采用 FOO 的(字符串)值并将其用作变量名。
zsh不支持此功能。
有没有办法使这项工作在bash和 中相同zsh?
我有一个环境变量列表,比如
PATH MAIL EDITOR
Run Code Online (Sandbox Code Playgroud)
并且想先打印变量名,然后打印它们的值。
这适用于bash但不适用于zsh:
PATH MAIL EDITOR
Run Code Online (Sandbox Code Playgroud)
应该以某种方式可能以“旧方式”使用eval,但我无法让它工作:
for VAR in LIST
do
echo $VAR
echo ${!VAR}
done
Run Code Online (Sandbox Code Playgroud)
我永远不会明白为什么我不能简单地进行任意深度替换,例如${${VAR}}或即使${${${VAR}}}需要,所以对此的解释也很好。