Bash Tips and Pitfalls: Difference between revisions
Jump to navigation
Jump to search
(→Tips: Parameter parsing) |
|||
Line 29: | Line 29: | ||
Some text |
Some text |
||
...on 2 lines... |
...on 2 lines... |
||
</source> |
|||
The different ways to extract file size in a Bash script: |
|||
<source lang="bash"> |
|||
SIZE=$(stat -c%s "$FILENAME") # Using stat |
|||
SIZE=$(ls -l $FILENAME | awk -F" "'{ print $5 }') # Using ls / awk |
|||
SIZE=$(du -b $FILENAME | sed 's/\([0-9]*\)\(.*\)/\1/') # Using du |
|||
SIZE=$(cat $FILENAME | wc -c) # Using cat / wc |
|||
SIZE=$(ls -l $FILENAME | cut -d " " -f 6) # Using ls / cut |
|||
</source> |
</source> |
||
Revision as of 15:18, 24 August 2009
Tips
Parsing Command-Line Option Parameters
- To ease parsing, pre-parse with executable getopt or Bash/sh built-in getopts, see here for more information and examples.
- To parse option like -value=name ([1])
until [[ ! "$*" ]]; do
if [[ ${1:0:2} = '--' ]]; then
PAIR=${1:2}
PARAMETER=`echo ${PAIR%=*} | tr [:lower:] [:upper:]`
eval P_$PARAMETER=${PAIR##*=}
fi
shift
done
Miscellaneous
Empty a file named filename, keeping the same permission and user/group:
>filename
Print multi-lines text with echo:
$ echo -e "Some text\n...on 2 lines..." # Enable interpretation of backslash escapes (must be quoted!)
Some text
...on 2 lines...
The different ways to extract file size in a Bash script:
SIZE=$(stat -c%s "$FILENAME") # Using stat
SIZE=$(ls -l $FILENAME | awk -F" "'{ print $5 }') # Using ls / awk
SIZE=$(du -b $FILENAME | sed 's/\([0-9]*\)\(.*\)/\1/') # Using du
SIZE=$(cat $FILENAME | wc -c) # Using cat / wc
SIZE=$(ls -l $FILENAME | cut -d " " -f 6) # Using ls / cut
Pits
Description | Example |
---|---|
Space! - Don't forget to add spaces whenever necessary, in particular around brace in function definition, or in test conditions for ifs. |
if -space- [ -space- -f /etc/foo -space- ]; then ... |
Quote - Always quote parameters, variables passed to test in if ... then ... else: |
if [ "$name" -eq 5 ]; then ... |
For loops with file - Use simply * to list files in for loops, not `ls *`: |
for file in *; cat "$file"; done # SUCCEEDS, even if white space
for file in `ls *`; cat "$file"; done # FAILS miserably
|
Space variable setting - There must be no space between the variable name and the subsequent equal sign. Also the variable name must not be prefixed with a $ |
srcDir = $1 # WRONG - spaces around = sign
$srcDir=$1 # WRONG - variable name must not have $ prefix
srcDir=$1 # CORRECT
srcDir="$1" # BEST
|