shell - 需要 Shell 函数替换条件
问题描述
我对 shell 脚本非常陌生,我需要编写一个脚本,条件非常简单:
我有 2 个目录位置
第一个目录:$ABC_123/cert
其中包含3个文件:
文件 1.pem 文件 2.pem 文件 3.pem
第二个目录:$ABC_123/private
其中包含2个文件:
文件 4.pem 文件 5.pem
这些文件需要替换/附加来自用户输入目录位置的文件,具体取决于以下条件
- 如果用户输入目录位置中存在 file3,则取回上述两个目录下的所有文件,然后替换 file1、file2、file4、file5 并附加 file3
- 如果用户输入目录位置中不存在 file3,则仅备份并替换文件 1、file2、file4、file5
我想为备份和替换/附加条件编写一个 shell 函数。
下面是我写的shell:
#!/bin/sh
$ABC_123=/ABC/123/XCOM
export ABC_123
# input the change number
printf 'Enter the NUMBER number\n'
read NUMBER
file1="$ABC_123/certs/fil2cert.pem"
file2="$ABC_123/certs/fil2cert.pem"
file3="$ABC_123/certs/fil3cert.pem"
file4="$ABC_123/private/fil4key.pem"
file5="$ABC_123/private/fil5key.pem"
file6="$ABC_123/private/fil6key.pem"
file7="/tmp/$NUMBER/fil3cert.pem"
# Begining of the implementation
if [ -f $file1 ] && [ -f $file2 ] && [ -f $file3 ] && [ -f $file4 ] && [ -f $file5 ] && [ ! -f $file6 ] && [ -f $file7 ]
then
#
#BACKUP
#
cp -p $file1 $file1.$(date +%Y-%m-%d).bkp
cp -p $file2 $file2.$(date +%Y-%m-%d).bkp
cp -p $file3 $file3.$(date +%Y-%m-%d).bkp
cp -p $file4 $file4.$(date +%Y-%m-%d).bkp
cp -p $file5 $file5.$(date +%Y-%m-%d).bkp
#
#REPLACE
#
cp /tmp/$NUMBER/*key.pem $ABC_123/private/
cp /tmp/$NUMBER/*cert.pem $ABC_123/certs/
cat /tmp/$NUMBER/fil3cert.pem >> $ABC_123/certs/fil3cert.pem
#
#CHANGE PERMISSIONS
#
chmod 644 $ABC_123/private/*key.pem
chmod 644 $ABC_123/certs/*cert.pem
chmod 644 $ABC_123/certs/fil3cert.pem
chown root:root $ABC_123/private/*key.pem
chown root:root $ABC_123/certs/*cert.pem
chown root:root $ABC_123/certs/fil3cert.pem
elif [ -f $file1 ] && [ -f $file2 ] && [ -f $file3 ] && [ -f $file4 ] && [ -f $file5 ] && [ ! -f $file6 ] && [ ! -f $file7 ]
then
#
#BACKUP
#
cp -p $file1 $file1.$(date +%Y-%m-%d).bkp
cp -p $file2 $file2.$(date +%Y-%m-%d).bkp
cp -p $file3 $file3.$(date +%Y-%m-%d).bkp
cp -p $file4 $file4.$(date +%Y-%m-%d).bkp
#
#REPLACE
#
cp /tmp/$NUMBER/*key.pem $ABC_123/private/
cp /tmp/$NUMBER/*cert.pem $ABC_123/certs/
#
#CHANGE PERMISSIONS
#
chmod 644 $ABC_123/private/*key.pem
chmod 644 $ABC_123/certs/*cert.pem
chown root:root $ABC_123/private/*key.pem
chown root:root $ABC_123/certs/*cert.pem
elif [ ! -f $file1 ] && [ ! -f $file2 ] && [ ! -f $file3 ] && [ ! -f $file4 ] && [ ! -f $file5 ] && [ ! -f $file6 ]
then
#
#REPLACE
#
cp /tmp/$NUMBER/*key.pem $ABC_123/private/
cp /tmp/$NUMBER/*cert.pem $ABC_123/certs/
cp /tmp/$NUMBER/fil3cert.pem $ABC_123/certs/
#
#CHANGE PERMISSIONS
#
chmod 644 $ABC_123/private/*key.pem
chmod 644 $ABC_123/certs/*cert.pem
chmod 644 $ABC_123/certs/fil3cert.pem
chown root:root $ABC_123/private/*key.pem
chown root:root $ABC_123/certs/*cert.pem
chown root:root $ABC_123/certs/fil3cert.pem
elif [ -f $file6 ]
then
#
# BACKUP
#
find $ABC_123/certs/* -type f -exec mv {} {}.$(date +%Y-%m-%d).bkp \;
find $ABC_123/private/* -type f -exec mv {} {}.$(date +%Y-%m-%d).bkp \;
#
# REPLACE
#
cp /tmp/$NUMBER/*key.pem $ABC_123/private/
cp /tmp/$NUMBER/*cert.pem $ABC_123/certs/
cp /tmp/$NUMBER/fil3cert.pem $ABC_123/certs/
#
# CHANGE PERMISSIONS
#
chmod 644 $ABC_123/private/*key.pem
chmod 644 $ABC_123/certs/*cert.pem
chmod 644 $ABC_123/certs/fil3cert.pem
chown root:root $ABC_123/private/*key.pem
chown root:root $ABC_123/certs/*cert.pem
chown root:root $ABC_123/certs/fil3cert.pem
elif [ ! -f "$file1" ] || [ ! -f "$file2" ] || [ ! -f "$file3" ] || [ ! -f "$file4" ] || [ ! -f "$file5" ] && [ ! -f "$file6" ] ; then
# At least one file is missing, writing the list of missing file(s):
echo -n "Missing file(s): "
for i in "$file1" "$file2" "$file3" "$file4" "$file5" ; do
if [ ! -f "$i" ] ; then
echo -n "$i "
fi
done
echo
fi
我想使用 shell 函数而不是一次又一次地重复 BACKUP、REPLACEMENT 和 CHANGE PERMISSION 命令
解决方案
您的 shell 函数可能类似于
all_present() {
for file
do
[ -f $file ] || return 1
done
return 0
}
它会像这样使用:
if ! all_present "$file1" "$file2" "$file3" "$file4" "$file5" "$file6"
then
echo at least one is missing
...
顺便说一句:如果您可以从 shell 切换到 bash 或 zsh 或 ksh,您可以将所有文件保存在一个数组中,整个表达式会更简单。
推荐阅读
- c# - 在c#中,如何将用户控件链接到表单?
- java - 在 Android 应用程序中找不到 NullPointerException 的原因
- python - 错误:astype() 有一个意外的关键字参数“类别”
- web-services - 如何将文件从 xamarin 移动应用程序上传到 Web 服务?
- javascript - 回到顶部元素在触摸操作系统上保持悬停状态
- javascript - 按回车时,文本输入值消失(纯js)
- microsoft-graph-api - 用于获取分配给 Azure AD 中特定自定义角色的用户列表的 api
- azure-devops - 用于 gupta 团队开发人员应用程序的 CI/CD 管道?
- salt-stack - salt minions 如何返回多个结果
- laravel - 类 'Ixudra\\Curl\\Facades\\Curl' 未找到