首页 > 解决方案 > 如何在bash中使双引号变量输出空而不是两个单引号?

问题描述

例如,我有一个 bash 脚本

[root@test ~]# cat 1.sh
#!/bin/bash
var1=""
var2=""
touch "$var1"
touch $var2

它输出为:

[root@test ~]# bash -x 1.sh
+ var1=
+ var2=
+ touch ''
touch: cannot touch ‘’: No such file or directory
+ touch
touch: missing file operand

所以如果我使用"$var"over 命令,当它为空时,它将变成''并破坏我的命令

而如果我$var不使用双引号,它可以工作,但外壳检查保持投诉双引号以防止分词

我该如何解决这个问题?

- - - - - - -编辑 - - - -

这里是touch例子,请不要介意这里的命令,目标是让它什么都不输出

例如

my_command $var1 $var2 $var3 $var4

这些 var 可以是空的,所以如果我双引号它

my_command "$var1" "$var2" "$var3" "$var4"

假设如果 var1 和 2 为空,那么它将运行为

var1=""
var2=""
var3="some"
var4="thing"
my_command "$var1" "$var2" "$var3" "$var4"

它输出为

my_command '' '' some thing,并因''争论而中断。

如果我做

var1=""
var2=""
var3="some"
var4="thing"
my_command $var1 $var2 $var3 $var4

一切my_command some thing 正常,但外壳检查会不断抱怨:(

标签: bash

解决方案


未引用时,空字符串var=""; touch $var将扩展为空(就好像您没有添加它一样)。

但是当被引用时var=""; touch "$var",它会扩展为空字符串var,这是一个无效的文件名参数touch


推荐阅读