将bash字符串操作的输出分配给变量

将bash字符串操作的输出分配给变量,bash,sed,ubuntu-16.04,Bash,Sed,Ubuntu 16.04,在Ubuntu 16.04上,我有一个bash脚本,我以root用户身份运行。我想删除用户输入中的所有空格,并将修剪后的字符串指定给变量 read -p "Enter username: " USERNAME echo "$USERNAME" | sed s/' '/''/g TRIM="$USERNAME" | sed s/' '/''/g echo $TRIM echo "Done" 以下是一些示例输入和输出: 输入用户名:hjkl hjkl 完成 $TRIM为空。 要获得$TRIM以包含

在Ubuntu 16.04上,我有一个bash脚本,我以root用户身份运行。我想删除用户输入中的所有空格,并将修剪后的字符串指定给变量

read -p "Enter username: " USERNAME
echo "$USERNAME" | sed s/' '/''/g
TRIM="$USERNAME" | sed s/' '/''/g
echo $TRIM
echo "Done"
以下是一些示例输入和输出:

输入用户名:hjkl
hjkl

完成

$TRIM为空。
要获得$TRIM以包含结果,我需要做什么更改?

使用
$()
捕获命令的输出

trim=$(echo "$USERNAME" | sed 's/ //g')
但是,您不需要命令,可以使用
bash
进行替换

trim=${username// /}
注意:不要使用大写变量名,它们通常是为环境变量保留的。

使用
$()
捕获命令的输出

trim=$(echo "$USERNAME" | sed 's/ //g')
但是,您不需要命令,可以使用
bash
进行替换

trim=${username// /}

注意:不要使用大写变量名,它们通常是为环境变量保留的。

脚本中有几点需要注意。

首先,像
USERNAME
这样的大写标识符通常是为环境变量保留的。因此,您可能会意外地重写一个shell变量,从而导致不期望的效果。
TRIM
的情况也是如此

其次,您应该使用内置的
shell
检查Ubuntu发行版中的默认shell。做点像

echo $SHELL
如果输出为
dash
bash
,则可以使用命令替换来实现目标

trim=$(echo "$username" | sed 's/ //g')
请注意,
sed
命令本身应该放在单引号下。

当您回显
trim
时,请使用双引号防止像

echo "$trim" # In your case though the double quotes doesn't make any difference

在脚本中有几件事你应该注意。

首先,像
USERNAME
这样的大写标识符通常是为环境变量保留的。因此,您可能会意外地重写一个shell变量,从而导致不期望的效果。
TRIM
的情况也是如此

其次,您应该使用内置的
shell
检查Ubuntu发行版中的默认shell。做点像

echo $SHELL
如果输出为
dash
bash
,则可以使用命令替换来实现目标

trim=$(echo "$username" | sed 's/ //g')
请注意,
sed
命令本身应该放在单引号下。

当您回显
trim
时,请使用双引号防止像

echo "$trim" # In your case though the double quotes doesn't make any difference

如果我使用bash参数扩展操作符,我会得到
/trim.sh:3:./trim.sh:Bad substitution
,那么您并没有真正使用
bash
。请参阅@JamesNewton:You可能缺少
echo
@sjsam在他得到错误的命令中没有
echo
。@sjsam内部有引号:
s/'/'/'/g
但是第二个引号是不需要的。如果我使用bash参数展开运算符,我得到了
/trim.sh:3:./trim.sh:Bad substitution
那么你就没有真正使用
bash
。请参阅@JamesNewton:You可能缺少
echo
@sjsam他从中得到错误的命令中没有
echo
。@sjsam内部有引号:
s/'/'/'/g
,不过第二个引号是不需要的。实际上引号起了很大作用。如果用户输入一个包含shell通配符或不规则空格的表达式,没有引号的程序将使输出混乱。事实上引号起了很大的作用。如果用户输入包含shell通配符或不规则空格的表达式,则不带引号的程序将使输出混乱。