我正在尝试编写一个脚本,该脚本正在下载Bash和最新的安全补丁:
cd ~/sources
mkdir bash && cd $_
wget https://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz
wget -r -np -nd --reject="index.html*,.sig" https://ftp.gnu.org/gnu/bash/bash-4.4-patches/
nfiles=$(ls | wc -l)
tar zxf bash-4.4.tar.gz && cd bash-4.4
echo "Patching sourcefiles..."
for i in ../bash44-[0-9][0-9][0-9]; do patch -p0 -s < $nfiles; done
echo "Compiling GNU bash..."
./configure --prefix=/usr/local
make
make install
cp -f /usr/local/bin/bash /bin/bash我使用wget获取所有补丁文件(共12个),并使用nfiles=$(ls | wc -l)将其保存到该变量中。这是第一个问题。nfiles的内容是13,因为bash-4.4.tar.gz也在计算,但我只有12个补丁文件。
现在我试着在这里打补丁:
for i in ../bash44-[0-9][0-9][0-9]; do patch -p0 -s < $nfiles; done
但是这不起作用,他不能从bash44-001修补到bash44-012...
nfiles变量包含12(13)作为数字,但我需要另一种格式才能使它像012一样工作。
我希望你们能理解我的问题。
发布于 2017-03-20 00:54:43
我不确定我是否完全理解你的问题,但我会尽力帮助你。
问题1: $(ls | wc -l)返回的行数多于所需的行数。
如果我想确保只计算正确的文件,我总是使用find --下面这样的代码可能适合您:
$(find . -name "bash44-[0-9][0-9][0-9]" | wc -l)问题2:通配符[0-9][0-9][0-9]不能保持数字顺序。
我觉得奇怪的是,在for循环中没有任何地方使用变量i。
尝试如下所示:
for i in `eval echo "{000..0$nfiles}"`; do echo "bash44-$i"; done常规问题:
如果您正在尝试使用格式为"bash44-[0-9][0-9][0-9]“的目录列表执行某些操作,并且希望以升序执行此操作,我将简单地执行以下操作:
for dir in `find . -type d -name "bash44-[0-9][0-9][0-9]" | sort`; do
something_with "$dir"
done发布于 2017-03-20 00:57:26
您可以更改:
nfiles=$(ls | wc -l)至
nfiles=$(wc -l < <(printf '%s\n' bash44-[0-9][0-9][0-9]))这将把bash-4.4.tar.gz排除在统计范围之外。
更好的是,您可以将正则表达式存储在一个变量中,并在两个位置使用它:
file_regex='bash44-[0-9][0-9][0-9]'
nfiles=$(wc -l < <(printf '%s\n' $file_regex))以及以后的
for i in $file_regex; do patch ...我不确定< $nfiles是否会将nfiles变量的内容视为文件,但这里的情况并非如此。你是想说patch -p0 -s $nfiles吗?如果您确实希望patch命令从标准输入中读取数字,那么您需要这样:
patch -p0 -s <(echo $nfiles)另请参阅:
https://stackoverflow.com/questions/42889123
复制相似问题