如何不在shell脚本中用echo(和wc)打印新行?

use*_*976 5 shell-script

我已经完成了这个脚本:

#! /bin/sh  
path="foo" 
while touch $path ; do 
    path=./${path} 
done 

echo "echec avec le nom $path qui fait" 
echo $path|wc -c 
echo "caracteres"
Run Code Online (Sandbox Code Playgroud)

如何在同一行打印 3 条回声线?

mik*_*erv 10

如果你根本不使用它会好得多echo。将echowhen 与任意输入结合使用可能会产生意想不到的效果。更重要的是,您不需要wc计算 shell 变量中的字符数 - shell 也可以这样做,而无需执行单独的启动进程。

例如:

wc

_path=/some/place/in/my/filesystem
printf %s "$_path" | wc -c

###OUTPUT###
28
Run Code Online (Sandbox Code Playgroud)

没有wc

printf %s "${#_path}"

###OUTPUT###
28
Run Code Online (Sandbox Code Playgroud)

两个printf论点:

printf 'Arg char count:\t%s\nArg contents:\t%s\n' \                                                                    
    "${#_path}" "$_path"

###OUTPUT###
Arg char count: 28
Arg contents:   /some/place/in/my/filesystem
Run Code Online (Sandbox Code Playgroud)

你的命令:

printf 'echec avec le nom %s qui fait %s caracteres\n' \
    "$_path" "${#_path}"

###OUTPUT###
echec avec le nom /some/place/in/my/filesystem qui fait 28 caracteres
Run Code Online (Sandbox Code Playgroud)

请参阅为什么 printf 比 echo 好?以及有关POSIX 参数扩展的规范以获取更多信息。


gol*_*cks 6

echo使用在 linux 系统1 上使用的来抑制换行符,请使用-n

echo -n "echec avec le nom $path qui fait"
Run Code Online (Sandbox Code Playgroud)

但是,wc也会打印一个换行符,并且不能被抑制,但可以将其丢弃:

size=$(echo $path | wc -c);
echo "echec avec le nom $path qui fait $((size-1)) caracteres"
Run Code Online (Sandbox Code Playgroud)

我在$((size-1))这里使用是因为wc将通过回声计算换行符输出。您可以改为使用size=$(echo -n $path | wc -c),但要注意关于-n.


1. -nGNU coreutil的echo实现是非标准的,所以YMMV。幸运的是,您实际上并不需要在这里使用它。