首页 > 解决方案 > 需要 Shell 函数替换条件

问题描述

我对 shell 脚本非常陌生,我需要编写一个脚本,条件非常简单:

我有 2 个目录位置

第一个目录:$ABC_123/cert

其中包含3个文件:

文件 1.pem 文件 2.pem 文件 3.pem

第二个目录:$ABC_123/private

其中包含2个文件:

文件 4.pem 文件 5.pem

这些文件需要替换/附加来自用户输入目录位置的文件,具体取决于以下条件

  1. 如果用户输入目录位置中存在 file3,则取回上述两个目录下的所有文件,然后替换 file1、file2、file4、file5 并附加 file3
  2. 如果用户输入目录位置中不存在 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

解决方案


您的 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,您可以将所有文件保存在一个数组中,整个表达式会更简单。


推荐阅读