我有代码
file="JetConst_reco_allconst_4j2t.png"
if [[ $file == *_gen_* ]];
then
echo "True"
else
echo "False"
fi
Run Code Online (Sandbox Code Playgroud)
我测试是否file包含“gen”。输出为“假”。好的!
问题是当我用变量替换“gen”时testseq:
file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
if [[ $file == *_$testseq_* ]];
then
echo "True"
else
echo "False"
fi
Run Code Online (Sandbox Code Playgroud)
现在输出为“真”。怎么会这样?如何解决问题?
阅读24.2 后。局部变量,我认为var用关键字声明一个变量local意味着它var的值只能在由函数大括号分隔的代码块内访问。
但是,在运行以下示例后,我发现var也可以从该代码块调用的函数中访问、读取和写入 - 即即使var声明local为outerFunc,innerFunc仍然能够读取它并更改其值。
#!/usr/bin/env bash
function innerFunc() {
var='new value'
echo "innerFunc: [var:${var}]"
}
function outerFunc() {
local var='initial value'
echo "outerFunc: before innerFunc: [var:${var}]"
innerFunc
echo "outerFunc: after innerFunc: [var:${var}]"
}
echo "global: before outerFunc: [var:${var}]"
outerFunc
echo "global: after outerFunc: [var:${var}]"
Run Code Online (Sandbox Code Playgroud)
输出:
global: before outerFunc: [var:] # as expected, `var` is not accessible outside of …Run Code Online (Sandbox Code Playgroud) 我需要在 bash 中连接两个字符串,以便:
string1=hello
string2=world
mystring=string1+string2
Run Code Online (Sandbox Code Playgroud)
echo mystring 应该产生
你好,世界
我有一个 bash 脚本,当它接受一个参数时会产生一个 cat 输出。我还有另一个 bash 脚本,它使用我想用来生成 cat 输出的参数来执行第一个 bash 脚本。如何将第一个 bash 脚本生成的 cat 输出存储在变量中?
说我有一个脚本在做:
some-command "$var1" "$var2" ...
Run Code Online (Sandbox Code Playgroud)
而且,如果var1为空,我宁愿将其替换为空字符串而不是空字符串,以便执行的命令是:
some-command "$var2" ...
Run Code Online (Sandbox Code Playgroud)
并不是:
some-command '' "$var2" ...
Run Code Online (Sandbox Code Playgroud)
有没有比测试变量并有条件地包含它更简单的方法?
if [ -n "$1" ]; then
some-command "$var1" "$var2" ...
# or some variant using arrays to build the command
# args+=("$var1")
else
some-command "$var2" ...
fi
Run Code Online (Sandbox Code Playgroud)
是否有参数替换可以在 bash、zsh 等中扩展为空?我可能仍然想在其余参数中使用通配符,因此禁用它并取消引用变量不是一种选择。
我想通过插入变量来构造一个 xml 字符串:
str1="Hello"
str2="world"
xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>'
echo $xml
Run Code Online (Sandbox Code Playgroud)
结果应该是
<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2>
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>
Run Code Online (Sandbox Code Playgroud)
我也试过
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Run Code Online (Sandbox Code Playgroud)
但这会删除内部双引号并给出:
<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
Run Code Online (Sandbox Code Playgroud) 这个问题不是关于如何编写正确转义的字符串文字。我找不到任何与如何转义变量以在脚本或其他程序中直接使用的相关问题。
我的目标是使脚本能够生成其他脚本。这是因为生成的脚本中的任务将在另一台机器上运行 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 完成,则需要进一步的输入)。
在bash脚本中,我需要来自/proc/文件的各种值。到现在为止,我有几十行像这样直接 grep 文件:
grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
Run Code Online (Sandbox Code Playgroud)
为了提高效率,我将文件内容保存在一个变量中并进行了搜索:
a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
Run Code Online (Sandbox Code Playgroud)
而不是多次打开文件,这应该只打开一次并grep变量内容,我认为这会更快 - 但实际上它更慢:
grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
Run Code Online (Sandbox Code Playgroud)
dash和也是如此zsh。我怀疑/proc/文件的特殊状态是一个原因,但是当我将 的内容复制/proc/meminfo到常规文件并使用它时,结果是相同的:
a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
Run Code Online (Sandbox Code Playgroud)
使用 here 字符串来保存管道使其稍微快一点,但仍然不如文件快:
bash 4.4.19 $ time for i in {1..1000};do grep ^MemFree /proc/meminfo;done >/dev/null
real 0m0.803s
user 0m0.619s
sys 0m0.232s
bash 4.4.19 $ a=$(</proc/meminfo)
bash 4.4.19 $ time for i in {1..1000};do echo …Run Code Online (Sandbox Code Playgroud) 在bash脚本中,如何从字符串中删除单词,该单词将存储在变量中。
FOO="CATS DOGS FISH MICE"
WORDTOREMOVE="MICE"
Run Code Online (Sandbox Code Playgroud) variable ×10
bash ×7
shell-script ×6
shell ×5
string ×2
zsh ×2
cat ×1
control-flow ×1
function ×1
xml ×1