Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 变量比较与模式替换_Bash_If Statement_Sed - Fatal编程技术网

Bash 变量比较与模式替换

Bash 变量比较与模式替换,bash,if-statement,sed,Bash,If Statement,Sed,我试图创建一个bash脚本,它使用sed命令将模式替换为包含字符串的变量,或者在变量中没有任何内容时放置空格。我找不到好的方法来写它并使它工作。以下是我遇到的问题: a_flag=$(echo $a | wc -w) if [[ $a_flag = 0 ]]; then sed -i -e 's/#b/\\hspace{2cm}/g' source.tex else sed -i -e "s/#b/$a/g" source.tex fi 运行此操作时,条件始终为false。

我试图创建一个bash脚本,它使用sed命令将模式替换为包含字符串的变量,或者在变量中没有任何内容时放置空格。我找不到好的方法来写它并使它工作。以下是我遇到的问题:

a_flag=$(echo $a | wc -w)

if  [[ $a_flag = 0 ]]; then
    sed -i -e 's/#b/\\hspace{2cm}/g' source.tex
else
    sed -i -e "s/#b/$a/g" source.tex
fi

运行此操作时,条件始终为false。我尝试了[]或(())来获取if语句,但我就是找不到修复它的方法

无论如何,计算某件事的发生次数似乎是一种非常迂回的方法

case $a in
   *[A-Za-z0-9_]*) x='\\hspace{2cm}';;
   *)              x=$a;;
esac
sed -i "s/#b/$x/g" source.tex

这里只需要一个参数展开,如果展开为空,则将
$a
的展开替换为
\hspace{2cm}

sed -i -e "s/#b/${a:-\\\\hspace{2cm}}/g" source.tex

您需要一堆
\
,因为其中涉及两轮转义。首先,shell本身将每个
\\
减少为一个文本反斜杠。然后
sed
还将每对
\
减少为一个文字反斜杠。

用if[“$a_flag”-eq“0”]替换if语句的可能重复项@WiktorStribiżew我尝试了公认答案的两种解决方案,但仍然不起作用。我尝试了((a#u flag=0))和[“$a#u flag”-eq“0”]
sed-I-e“s/#b/${a:-\\\\hspace{2cm}/g”source.tex
.Done.我们在这里有点茫然,因为不清楚
$a
到底包含什么。我想它永远不会像@chepner假设的那样完全是空的。我尝试了这个,这次它打印了\hspace,但没有打印a:
case$a in*[a-Za-z0-9.]*)sed-I-e的s/#b/\\hspace{2cm}中的内容/g'source.tex;;*)sed-i-e“s/#b/$a/g”source.tex;;esac