通过管道通信在bash中传递目录
这个问题是一个家庭作业,我知道解决这个问题会有更简单的方法,但事实就是这样 问题如下:通过管道通信在bash中传递目录,bash,unix,pipe,Bash,Unix,Pipe,这个问题是一个家庭作业,我知道解决这个问题会有更简单的方法,但事实就是这样 问题如下: -我有一个bash脚本,可以执行一些操作并创建一些文件。 -我必须通过管道(|)将此脚本(目录)的第一个参数传递给另一个脚本 当我尝试将此目录作为参数传递时,问题就出现了。在另一个脚本中,我收到的参数是null 这是完整的代码,按此顺序排列。 没有遗漏什么 第一个脚本至少接收11个参数: if [[ $# -lt 11 ]]; then echo "Not enough arguments." >
-我有一个bash脚本,可以执行一些操作并创建一些文件。
-我必须通过管道(
|
)将此脚本(目录)的第一个参数传递给另一个脚本
当我尝试将此目录作为参数传递时,问题就出现了。在另一个脚本中,我收到的参数是null
这是完整的代码,按此顺序排列。没有遗漏什么 第一个脚本至少接收11个参数:
if [[ $# -lt 11 ]]; then
echo "Not enough arguments." >&2;
exit 1;
fi;
脚本将检查第一个参数是否为实际目录:
if [[ ! -d $1 ]]; then
echo "Not a valid first argument." >&2;
exit 1;
fi;
在这里,我将在这里保存我的第一个目录,这样我就可以shift
,然后我将声明我需要的更多内容
Directory=$1;
shift;
N=$#
name_array=("$#")
Pos=0;
之后,脚本将使用所有其他参数创建具有这些名称的.txt文件,并在每个.txt文件中添加许多非空行(因此,argument2.txt有N-1行,argument3.txt有N-2行…argumentN.txt有1行)。之后,我必须将其权限更改为600
while [[ $# -gt 0 ]]; do
if [[ -a "$Directory"/"$1".txt ]]; then
rm "$Directory"/"$1".txt;
fi
touch "$Directory"/"$1".txt
for((i=0;i<N;i++)); do
echo "$N" >> "$Directory"/"$1".txt;
done;
chmod u=rw "$Directory"/"$1".txt;
N=$(($N-1));
name_array["$Pos"]="$Directory"/"$1".txt;
Pos=$(($Pos + 1));
shift;
done;
我也尝试过这个,结果和上面的一样
echo "$(cd "$(dirname "$Directory")" && pwd -P)/$(basename "$Directory")";
。。这样我就可以在Shell中使用管道命令
第二个脚本将接收目录,输入它并通过刚才创建的所有文件进行搜索
在Unix终端中,我使用以下命令:
./FirstScript.bash 1 2 3 4 5 6 7 8 9 10 11 12 | ./SecondScript.bash
提前谢谢你 谢谢你的诚实,当然我们不会给你做家庭作业,但是 大部分代码看起来都很好。还有一些较小的问题,您可以使用
shellcheck
轻松解决(如果未安装,请安装它或使用web版本),我不会将代码>位于每行末尾
因此,与其立即运行整个管道,不如将其分解以找出问题所在。如果你跑
./FirstScript.bash 1 2 3 4 5 6 7 8 9 10 11 12
如果输出符合预期(因此,使用echo$目录
),并且创建了文件,那么第一个脚本就可以了。因此,在这种情况下,目录1
将包含文件2 3 4 5 6 7 8 9 10 11 12
,输出将是1
然后,您将运行第二个脚本
./SecondScript.bash
作为输入,您将给出:
1
^D
(即Unix上的control-d)。然后第二个脚本应该做你想做的(或者不做)
通过这种方式,您可以单独调试脚本
(快速面对手掌问题:1真的是您想要的目录吗,还是您只是忘记了作为第一个参数的目录名?谢谢您的诚实,当然我们不会做您的家庭作业,但是
大部分代码看起来都很好。还有一些较小的问题,您可以使用shellcheck
轻松解决(如果未安装,请安装它或使用web版本),我不会将代码>位于每行末尾
因此,与其立即运行整个管道,不如将其分解以找出问题所在。如果你跑
./FirstScript.bash 1 2 3 4 5 6 7 8 9 10 11 12
如果输出符合预期(因此,使用echo$目录
),并且创建了文件,那么第一个脚本就可以了。因此,在这种情况下,目录1
将包含文件2 3 4 5 6 7 8 9 10 11 12
,输出将是1
然后,您将运行第二个脚本
./SecondScript.bash
作为输入,您将给出:
1
^D
(即Unix上的control-d)。然后第二个脚本应该做你想做的(或者不做)
通过这种方式,您可以单独调试脚本
(快速面对手掌问题:1真的是您想要的目录,还是您忘记了作为第一个参数的目录名?使用管道意味着收件人应该读取标准输入,而不是处理命令行参数。但你想问什么还真不清楚。是的,你遗漏了问题中最重要的部分。剩下的部分可以简化为FirstScript${Dir}x |/SecondScript
。现在还不清楚echo“$(cd“$(dirname“$目录”)”和&pwd-P)/$(basename“$目录”)有什么优势代码>。只要坚持使用echo“$Directory”
(如果您的讲师以FirstScript“Dir with Spaces”x
?;-)开头,您当前的代码会做什么。祝你好运。@Sheller我被要求提供通过管道连接执行下一个脚本的绝对路径,很抱歉不清楚。是的,我现在坚持使用echo$SomeArgument |/SomeScript.bash
,看在神圣的份上。感谢您的帮助。使用管道意味着收件人应该读取标准输入,而不是处理命令行参数。但你想问什么还真不清楚。是的,你遗漏了问题中最重要的部分。剩下的部分可以简化为FirstScript${Dir}x |/SecondScript
。现在还不清楚echo“$(cd“$(dirname“$目录”)”和&pwd-P)/$(basename“$目录”)有什么优势代码>。只要坚持使用echo“$Directory”
(如果您的讲师以FirstScript“Dir with Spaces”x
?;-)开头,您当前的代码会做什么。祝你好运。@Sheller我被要求提供通过管道连接执行下一个脚本的绝对路径,很抱歉不清楚。是的,我现在坚持使用echo$SomeArgument |/SomeScript.bash
,看在神圣的份上。谢谢你的帮助。这只是一个简单的例子。我不会把我的目录命名为1。不管怎样,我都设法解决了我的问题。当涉及到管道时,我更多地记录了我自己,并且我意识到如何正确地使用它们。不管怎样,谢谢你的回复!还有一个简短的问题。当有人说他们希望在两个脚本之间建立管道连接时,在第一个sc的末尾建立管道连接是否被认为是错误的