Man*_*noj 4 linux shell-script
我需要了解以下 shell 脚本的行为。
#!/bin/bash
echo "First more"
more $1
echo "First echo"
echo $1
echo "Second more"
more $1
Run Code Online (Sandbox Code Playgroud)
当我运行以下命令时:
echo dir1 | bash script.sh
Run Code Online (Sandbox Code Playgroud)
我得到以下输出
First more
dir1
First echo
Second more
Run Code Online (Sandbox Code Playgroud)
为什么echo第二个more无法访问 的内容$1?
当我运行以下命令时:
echo dir1 | bash script.sh dir2
Run Code Online (Sandbox Code Playgroud)
我得到以下命令
First more
dir1
*** dir2: directory ***
First echo
dir2
Second more
*** dir2: directory ***
Run Code Online (Sandbox Code Playgroud)
dir2被传递给所有命令,但更多只是打印dir1但被认为dir2是一个目录。
你混淆了参数和标准输入。将数据传送到程序并不等同于为其提供命令行参数。
在您的第一种情况下,您没有向脚本传递任何参数,仅通过其标准输入流为其提供数据。所以$1在脚本的整个持续时间内都没有设置。
因此的第一次调用more没有参数,并分页标准输入。这将显示您在其中输入的内容 ( dir1, 作为文本)。后续echo只打印一个新行,因为它没有打印任何东西,最后一个more也没有什么可打印的 - 标准输入已被第一个“耗尽”。
在第二种情况下,您确实传递了一个参数。所以$1有值dir2的脚本。同样的事情发生了,除了第一个more:
dir2和错误进行分页,因为那是一个目录回声做了预期的事情,因为它$1包含dir2,并且最后一个more唯一的错误是dir2- 它没有从标准输入中读取任何内容。