Bash-从脚本中删除换行符
我有一个脚本,我基本上已经完成了,除了一个问题,我似乎无法在一个换行符传递给zbarimg之前删除它。我试过各种各样的东西,在网上到处看看,似乎找不到任何东西来摆脱这个讨厌的角色。任何帮助都将不胜感激Bash-从脚本中删除换行符,bash,zbar,linefeed,Bash,Zbar,Linefeed,我有一个脚本,我基本上已经完成了,除了一个问题,我似乎无法在一个换行符传递给zbarimg之前删除它。我试过各种各样的东西,在网上到处看看,似乎找不到任何东西来摆脱这个讨厌的角色。任何帮助都将不胜感激 #!/bin/bash folder=~/Public cdate=$(date +"%Y-%m-%d-%H:%M") inotifywait -m -q -e create -r --format '%:e %w%f' $folder | while read file do
#!/bin/bash
folder=~/Public
cdate=$(date +"%Y-%m-%d-%H:%M")
inotifywait -m -q -e create -r --format '%:e %w%f' $folder | while read file
do
ifile=$(ls -Art ~/Public | tail -n 1)
ifile2=$(echo $ifile | tr '\n' ' ')
echo $ifile2 >> /tmp/latest.txt
zbarimg $ifile2 | pluma
done
ls-alrt的输出(最后几行)
您的问题有点不清楚,但在下面的脚本中,
ifile
或ifile2
的末尾没有换行符('\n'
)。虽然很难确定您试图消除的是什么新行
,但您的目标似乎是在将$ifile2
重定向到该文件后,防止新行
写入/tmp/latest.txt
。(这是唯一可以想象的有争议的新行
)整个交易中唯一涉及的新行
是echo
本身放在那里的新行
:
#!/bin/bash
folder=~/Public
cdate=$(date +"%Y-%m-%d-%H:%M")
inotifywait -m -q -e create -r --format '%:e %w%f' $folder | while read file
do
ifile=$(ls -Art ~/Public | tail -n 1)
ifile2=$(echo $ifile | tr '\n' ' ')
echo $ifile2 >> /tmp/latest.txt
zbarimg $ifile2 | pluma
done
如果您不想在/tmp/latest.txt
中写入任何newline
,请使用echo-n
或printf
,例如:
#!/bin/bash
folder=~/Public
cdate=$(date +"%Y-%m-%d-%H:%M")
inotifywait -m -q -e create -r --format '%:e %w%f' "$folder" | while read -r file
do
ifile=$(ls -Art ~/Public | tail -n 1)
echo -n "$ifile" >> /tmp/latest.txt # or printf "%s" "$ifile"
zbarimg "$ifile" | pluma
done
注意:您可以通过以下方式证明自己没有新行:
echo "'$ifile'"
注2:在bash中,除非在[…]]
中,否则应始终引用变量。(如果您不记得[[…]]
,请始终引用您的变量)。此外,使用ls
(任何排序顺序)填充变量ifile
容易出现一些细微的文件名错误(文件名中的换行符等)。有关尝试迭代返回ls
的相关原因,请参阅
“当我在脚本之外手动运行它时,它会很好地打开它
但在中引发无法从打开文件的错误
它”
好吧,这更有意义。在“$folder”
中查找最新文件的一种方法是,不使用解析ls
中固有的陷阱:
#!/bin/bash
folder=~/Public
cdate=$(date +"%Y-%m-%d-%H:%M")
inotifywait -m -q -e create -r --format '%:e %w%f' "$folder" | while read -r file
unset -v ifile
for fname in "$folder"/*; do
[[ $fname -nt $ifile ]] && ifile="$fname"
done
zbarimg "$ifile" | pluma
请尝试一下,让我知道这是否解决了问题。因此,在所有这些之后,事实证明真正的问题是我刚刚忘记将文件夹附加到文件名,因此zbarimg无法打开文件的原因与换行无关,就像我认为这里基本上解决了它:
zbarimg $folder/$ifile2
再次感谢所有提供帮助的人,对我的无能表示歉意愿互联网的祝福和宽恕降临到我身上:)你有没有尝试过如果没有输入和所需的输出,很难弄清楚你想要完成什么。如果您去掉inotifywait
和zbarimg
部分,只关注实际的字符串修改,您的问题会得到很大的改进。无论如何,echo$ifile
withwithout将同时丢失任何换行符,但可能是错误的换行符。没有'\n'
。你可以向自己证明它ifile=$(ls-Art~/Public | tail-n1);echo“$ifile”
您想用ifile2=
行删除什么新行?注意:在echo$ifile2
中,echo
自动添加换行符,使用echo-n$ifile2>/tmp/latest.txt
如果你想在$ifile2
之后没有换行符,我主要在那里有'latest.txt'文件进行调试,我真正想做的是防止在zbarimg实用程序中使用换行符,它的行为就像我传递给它的文件有一个新行字符一样,当我在脚本外部手动运行它时,它会很好地打开它,但会抛出一个错误,即无法从中打开文件。在这里,您必须小心。根据POSIX对文件的定义,所有文件都将有一个终止内容的换行符。这并不意味着所有文件都将满足POSIX行结束要求(您可以强制一个文件在结束时没有换行符),但所有符合POSIX的实用程序等都会期望有一个。我将搜索zbarimg
,看看是否能找到任何有用的东西。直到现在我才听说过。让我看看能找到什么。您的脚本(指定的脚本除外)没有做任何错误的事情,事实上,没有换行符的写入本身不是POSIX:)
@user1208273“当我在脚本之外手动运行它时,它会很好地打开它,但会抛出一个错误,即无法从中打开文件”。好吧,这才是真正的问题所在。您可以在答案的最后一段看到Bash陷阱
注释。我怀疑这就是问题的根源。您想从~/Public
中选择哪个文件(最新的?)。让我知道,我们将制定替代方案,不包括使用ls
和tail
选择它。(顺便说一句,条形码扫描不是问题所在,这是您填写ifile
的方式)是的,更正我的目的是运行该目录中的最新文件。好的,请查看答案末尾的添加内容,作为查找最新文件的替代方法。
zbarimg $folder/$ifile2