(已编辑) 假设我有一些这样的目录结构:
lv1_directory
| file_contain_word_something.txt
| lv2_directory
所以现在我在lv2_directory上,我有这样的代码:
#!/bin/bash
findfile=$(ack -n 'something' . | wc -l)
cd ..
ls
echo $findfile
当我运行脚本时,它会给我
lv2_directory file_contain_word_something.txt
0
但是如果我没有将其分配给变量,它的工作原理就像魅力
#!/bin/bash
cd ..
ls
ack -n 'something' | wl -l
给我
lv2_directory file_contain_word_something.txt
1
所以我必须将其更改为此才能使用
#!/bin/bash
findfile=$(ack -n 'something' .. | wc -l)
cd ..
ls
echo $findfile
它给了我想要的结果
lv2_directory file_contain_word_something.txt
1
如何使用第一个脚本并给我想要的结果?
答案 0 :(得分:0)
我认为这里的问题是:
您当前位于lv2_directory
中,其中没有与字符串'something'
匹配的任何文件。因此,当您从该目录本身触发ack
时,您将获得0
的行数。然后,您进行cd..
。
#!/bin/bash
findfile=$(ack -n 'something' . | wc -l)
cd ..
ls
echo $findfile
现在,在您的下一个片段中:
#!/bin/bash
cd ..
ls
ack -n 'something' | wl -l
您首先要进行cd
,所以您将进入lv1_directory
,该文件的文件为file_contain_word_something.txt
。然后,您解雇ack
。现在,它在something
文件中找到txt
,因此,您得到1
作为输出(假设只有1条匹配行)。
答案 1 :(得分:0)
就像您编写脚本一样,它永远不会在同一目录中列出( ls 指令)和计数( wc 指令),因此无法保证结果。
此外,根据您将启动脚本的目录,它可能根本无法工作。
您可以考虑在脚本开始时管理路径(并且不要在指令之间修改路径)吗?
您确切知道系统上的什么位置吗? 一种替代方法是创建一个环境变量(例如在您的〜/ .bash_profile 文件中),并在脚本开始时使用它,以确保始终在正确的目录中运行它
答案 2 :(得分:0)
经过一些实验,我可以使用函数获得想要的结果
#!/bin/bash
function findfile(){
ack -n 'something' | wc -l
}
cd ..
findfile
它会给你1
感谢您回答我的问题