BASH:从字符串中删除换行符(读取行)

Bog*_*scu 11 linux windows bash samba

我碰到了以下问题:我正在编写一个Linux bash脚本,它执行以下操作:

  • 从文件中读取行
  • \n从刚刚读取的行末尾删除字符
  • 执行那里的命令

示例:commands.txt

ls
ls -l
ls -ltra
ps as
Run Code Online (Sandbox Code Playgroud)

bash文件的执行应该得到第一行,然后执行它,但是\n现在,shell只输出"command not found:ls"脚本的那部分看起来像这样

 read line

        if [ -n "$line" ]; then #if not empty line

                #myline=`echo -n $line | tr -d '\n'`
                #myline=`echo -e $line | sed ':start /^.*$/N;s/\n//g; t start'`

                myline=`echo -n $line | tr -d "\n"`
                $myline  #execute it

                cat $fname | tail -n+2 > $fname.txt
                mv $fname.txt $fname
        fi
Run Code Online (Sandbox Code Playgroud)

评论说你在问SO之前我已经尝试过了.有解决方案吗 在过去的几个小时里,我正在粉碎我的大脑......

cms*_*cms 17

我总是喜欢perl -ne 'chomp and print'修剪换行符.很好,很容易记住.

例如 ls -l | perl -ne 'chomp and print'

然而

我不认为这是你的问题.虽然我不确定我是否理解你如何将文件中的命令传递到shell脚本中的'read'.

使用我自己的测试脚本(test.sh)

read line
if [ -n "$line" ]; then
  $line
fi
Run Code Online (Sandbox Code Playgroud)

和这样的示例输入文件(test.cmds)

ls 
ls -l
ls -ltra
Run Code Online (Sandbox Code Playgroud)

如果我像这样运行它./test.sh < test.cmds,我会看到预期的结果,即在当前工作目录上运行第一个命令'ls'.

也许您的输入文件中还包含其他不可打印的字符?

我看起来像这样

od -c test.cmds 
0000000    l   s      \n   l   s       -   l  \n   l   s       -   l   t
0000020    r   a  \n                                                    
0000023
Run Code Online (Sandbox Code Playgroud)

根据您在下面的评论,我怀疑您的输入文件中可能有回车符("\ r"),这与换行符不同.输入文件最初是DOS格式吗?如果是这样,那么你需要将结束"\ r \n"的2字节DOS行转换为单字节UNIX 1,"\n"以实现预期的结果.

您应该可以通过在任何注释掉的行中交换"\n"来表示"\n".


Mar*_*gar 13

有人已经编写了一个执行shell命令的程序:sh file

如果你真的只想执行文件的第一行: head -n 1 file |sh

如果您的问题是回车: tr -d '\r' <file |sh