我正在尝试编写一个脚本,它正在下载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一样工作。
我希望你们能理解我的问题。
答案 0 :(得分:0)
我不确定我是否理解你的问题,但无论如何我都会尽力帮助。
问题1: $(ls | wc -l)
返回的行数多于所需数量。
如果我想确保只计算正确的文件,我总是使用find
- 这样的事情可能对您有用:
$(find . -name "bash44-[0-9][0-9][0-9]" | wc -l)
问题2:通配符[0-9][0-9][0-9]
未保留数字顺序。
我发现奇怪的是变量i
在for
循环中没有使用。
尝试类似:
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
答案 1 :(得分:0)
您可以更改:
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
命令从stdin读取数字,那么你需要这个:
patch -p0 -s <(echo $nfiles)
另见: