This blog collects the commonly used code snippets based on my daily work, also do summary from related stackoverflow topics.
################################################################
if condition statements
list of bash condition statements
# sth does not exist?
if [[ "${sth}""X" == "X" ]]; then
LogMsg "###### INFO: ..."
fi
# directory does not exist?
if [[ ! -d "${folder_path}" ]]; then
LogMsg "###### ERROR: ${folder_path} directory doesn't exist!"
exit 1
fi
script input parameters
Usage()
{
echo
echo "Usage $0 ..."
echo "For example: ..."
}
if [ $# -eq 0 ]
then
echo "No command-line arguments were specified..."
Usage
exit 1
fi
while [ $# -gt 0 ]
do
case "$1" in
-flag1)
shift
<var1>=${1}
shift;;
-flag2)
shift
<var2>=${1}
shift;;
*) Usage
exit 1;;
esac
done
log message
LogMsg()
{
logMsg="$@"
echo "["`date +"%Y/%m/%d %r"`"]" ${logMsg}
}
LogMsg "###### INFO: ..."
LogMsg "###### WARNING: ..."
LogMsg "###### ERROR: ..."
check last command result
echo_success_failure() {
if [ $? -eq 0 ]; then
LogMsg "###### INFO: Success..."
else
LogMsg "###### INFO: Failure..."
fi
}
run as root
effective_uid=`id -u` 2>/dev/null
if [ $effective_uid -ne 0 ]; then
LogMsg "###### ERROR: Please run this script as root or sudo"
exit 1
fi
delimited string to array
convert delimited string to array, for example:
string="item1 item2 item3"
IFS=' ' read -a array <<< "${string}"
this version has no globbing problem, the split character is set in $IFS
(here is space), variables quoted.
${array[0]} ===> item1
${array[1]} ===> item2
${array[2]} ===> item3
don't forget to do sanity check after converting.
loop array
declare -a array=("element1" "element2" "element3")
for i in "${array[@]}"
do
echo "${i}"
done
declare
or typeset
are an explicit way of declaring variable in shell scripts.
In BASH it is safer to quote the variable using ""
for the cases when $i
may contain white spaces or shell expandable characters.
if you want to use index of array element
# get length of an array
arraylength=${#array[@]}
# use for loop to read all values and indexes
for (( i=0; i<${arraylength}; i++ ));
do
echo $i " / " ${arraylength} " : " ${array[$i]}
done
chmod
chmod recursively for directory and it's content
chmod -R 0755 <target directory>
only add executable for file not folder
find . -name '<file name>' -type f | xargs chmod +x
-rwxr-xr-x ...
pass parameters in script
# invoke, must stick to this format
echo "admin
admin" | ./script.sh
# receive code snippet in script.sh
MsgLog "###### Please enter args1 ..."
read args1
LogMsg "###### Please enter password ..."
read -s password
${args1} ===> admin
${password} ===> admin
Note:
read
-s
flag: do not echo input coming from a terminal, used for password
setup ssh password-less
ssh-keyscan -H ${remote} >> ~/.ssh/known_hosts
sshpass -p "<password>" ssh-copy-id -i ~/.ssh/id_rsa.pub root@${remote}
if [[ $? -ne 0 ]]; then
LogMsg "######ERROR: Something went wrong with ssh-copy-id. Check for incorrect credentials ... "
exit 1
fi
reinvoke
if [[ $? -ne 0 ]]; then
LogMsg "######ERROR: Something went wrong… "
<shell function name>
fi
网友评论