当前位置:网站首页>Chapter 19 Tips and Traps: Common Goofs for Novices
Chapter 19 Tips and Traps: Common Goofs for Novices
2022-08-01 23:12:00 【Dreamer DBA】
1.1 Forgetting to Set Execute Permissions
First, you could invoke bash and give it the name of the script as a parameter:
Or second (and better still), you could set the execute permission on the script so that you can run it directly:
[[email protected] test]$ ./fun_calc.sh
-bash: ./fun_calc.sh: Permission denied
[[email protected] test]$ bash fun_calc.sh
[[email protected] test]$ chmod a+x fun_calc.sh
[[email protected] test]$ ./fun_calc.sh
[[email protected] test]$
1.2 Fixing "No such file or directory" Errors
[[email protected] Day0801]$ cat busted
#!/bin/bash -
echo "Hello World!"
[[email protected] Day0801]$ # This works
[[email protected] Day0801]$ ./busted
Hello World!
[[email protected] Day0801]$ # But if the file gets DOS line endings,we get:
[[email protected] Day0801]$ ./busted1
/bin/bash: will: No such file or directory
Hello World!
[[email protected] Day0801]$
1.3 Forgetting That the Current Directory Is Not in the $PATH
Either add the current directory to the $PATH variable, which we do not recommend, or reference the script via the current directory with a leading ./ before the script name, as in: $ ./busted
[[email protected] Day0801]$ busted
bash: busted: command not found
[[email protected] Day0801]$ ./busted
Hello World!
[[email protected] Day0801]$
1.4 Naming Your Script Test
[[email protected] Day0801]$ type test
test is a shell builtin
[[email protected] Day0801]$
1.5 Expecting to Change Exported Variables
[[email protected]ellDBA Day0801]$ ./first.sh
VAL=5
in second
initially VAL=5
changed so VAL=12
back in first
VAL=5
[[email protected] Day0801]$ cat first.sh
#
# a simple example of a common mistake
#
# set the value:
export VAL=5
printf "VAL=%d\n" $VAL
#invoke our other script:
./second.sh
#
# now see what changed (hint:nothing!)
printf "%b" "back in first\n"
printf "VAL=%d\n" $VAL
[[email protected] Day0801]$ cat second.sh
#!/bin/bash
printf "%b" "in second\n"
printf "initially VAL=%d\n" $VAL
VAL=12
printf "changed so VAL=%d\n" $VAL
[[email protected] Day0801]$
and the second script has to echo the final value (and only the final value) to STDOUT (it could redirect its other messages to STDERR):
[[email protected] Day0801]$ ./first.sh
VAL=5
in second
initially VAL=5
changed so VAL=12
back in first
VAL=5
[[email protected] Day0801]$ cat first.sh
#
# a simple example of a common mistake
#
# set the value:
export VAL=5
printf "VAL=%d\n" $VAL
#invoke our other script:
./second.sh
#
# now see what changed (hint:nothing!)
printf "%b" "back in first\n"
printf "VAL=%d\n" $VAL
[[email protected] Day0801]$ cat second.sh
#!/bin/bash
printf "%b" "in second\n" >&2
printf "initially VAL=%d\n" $VAL >&2
VAL=12
printf "changed so VAL=%d\n" $VAL >&2
[[email protected] Day0801]$
1.6 Forgetting Quotes Leads to "command not found" on Assignments
You need quotes around the righthand side of the assignment to $ALLOPT. What is written above as: ALLOPT=$OPT1 $OPT2 really should be: ALLOPT="$OPT1 $OPT2"
[[email protected] Day0801]$ cat goof1.sh
#!/bin/bash -
# common goof:
# X=$Y $Z
# isn't the same as
# X="$Y $Z"
#
OPT1=-l
OPT2=-h
ALLOPT=$OPT1 $OPT2
ls $ALLOPT .
[[email protected] Day0801]$ chmod a+x goof1.sh
[[email protected] Day0801]$ ./goof1.sh
./goof1.sh: line 9: -h: command not found
busted busted1 dash.sh default_date.sh first.sh goof1.sh load_mp3.sh oodiff.sh second.sh
[[email protected] Day0801]$ cat goof1.sh
#!/bin/bash -
# common goof:
# X=$Y $Z
# isn't the same as
# X="$Y $Z"
#
OPT1=-l
OPT2=-h
ALLOPT="$OPT1 $OPT2"
ls $ALLOPT .
[[email protected] Day0801]$ ./goof1.sh
total 36K
-rwxrwxr-x 1 maxwell maxwell 34 Aug 1 19:33 busted
-rwxrwxr-x 1 maxwell maxwell 58 Aug 1 19:39 busted1
-rw-rw-r-- 1 maxwell maxwell 595 Aug 1 13:27 dash.sh
-rw-rw-r-- 1 maxwell maxwell 915 Aug 1 08:11 default_date.sh
-rwxrwxr-x 1 maxwell maxwell 228 Aug 1 19:49 first.sh
-rwxrwxr-x 1 maxwell maxwell 123 Aug 1 19:59 goof1.sh
-rw-rw-r-- 1 maxwell maxwell 1.4K Aug 1 13:49 load_mp3.sh
-rw-rw-r-- 1 maxwell maxwell 1.3K Aug 1 13:58 oodiff.sh
-rwxrwxr-x 1 maxwell maxwell 145 Aug 1 19:54 second.sh
[[email protected] Day0801]$
1.10 Deleting Files Using an Empty Variable
Never do:
rm -rf $files_to_delete
Never, ever, ever do:
rm -rf /$files_to_delete
Use this instead:
[ "$files_to_delete" ] && rm -rf $files_to_delete
1.11 Seeing Odd Behavior from printf
[[email protected] Day0801]$ cat oddscript
#!/bin/bash -
badnode=6
printf "good nodes: %d\n" $goodnode
printf "bad nodes: %d\n" $badnode
printf "miss nodes: %d\n" $missnode
printf "GOOD=%d BAD=%d MISS=%d\n" $goodnode $badnode $missnode
[[email protected] Day0801]$ bash oddscript
good nodes: 0
bad nodes: 6
miss nodes: 0
GOOD=6 BAD=0 MISS=0
[[email protected] Day0801]$
1.13 Debugging Scripts
Add set -x to the top of the script when you run it. Or use set -x to turn on xtrace before a troublesome spot and set +x to turn it off after.
[[email protected] Day0801]$ cat buggy
#!/usr/bin/env bash
# cookbook filename: buggy
#
set -x
result=$1
[ $result = 1 ] \
&& { echo "Result is 1; excellent." ; exit 0; } \
|| { echo "Uh-oh, ummm, RUN AWAY! " ; exit 120; }
Now we invoke this script, but first we set and export the value of the PS4 prompt. bash will print out the value of PS4 before each command that it displays during an execution trace (i.e., after a set -x ):
[[email protected] Day0801]$ cat buggy
#!/usr/bin/env bash
# cookbook filename: buggy
#
set -x
result=$1
[ $result = 1 ] \
&& { echo "Result is 1; excellent." ; exit 0; } \
|| { echo "Uh-oh, ummm, RUN AWAY! " ; exit 120; }
[[email protected] Day0801]$ export PS4='+trace $LINENO:'
[[email protected] Day0801]$ echo $PS4
+trace $LINENO:
[[email protected] Day0801]$ chmod a+x buggy
[[email protected] Day0801]$ ./buggy
+trace 6:result=
+trace 8:'[' = 1 ']'
./buggy: line 8: [: =: unary operator expected
+trace 10:echo 'Uh-oh, ummm, RUN AWAY! '
Uh-oh, ummm, RUN AWAY!
+trace 10:exit 120
[[email protected] Day0801]$ ./buggy 1
+trace 6:result=1
+trace 8:'[' 1 = 1 ']'
+trace 9:echo 'Result is 1; excellent.'
Result is 1; excellent.
+trace 9:exit 0
[[email protected] Day0801]$ ./buggy 2
+trace 6:result=2
+trace 8:'[' 2 = 1 ']'
+trace 10:echo 'Uh-oh, ummm, RUN AWAY! '
Uh-oh, ummm, RUN AWAY!
+trace 10:exit 120
[[email protected] Day0801]$
边栏推荐
猜你喜欢
sys_kill system call
APP special test: traffic test
2022年最新河北建筑八大员(机械员)模拟考试题库及答案
How do programmers solve online problems gracefully?
UML diagram of soft skills
xctf attack and defense world web master advanced area webshell
软技能之UML图
研发团队数字化转型实践
10年稳定性保障经验总结,故障复盘要回答哪三大关键问题?|TakinTalks大咖分享
y84. Chapter 4 Prometheus Factory Monitoring System and Actual Combat -- Advanced Prometheus Alarm Mechanism (15)
随机推荐
excel change cell size
img 响应式图片的实现(含srcset属性、sizes属性的使用方法,设备像素比详解)
Always use "noopener" or "noreferrer" for links that open in a new tab
6133. Maximum number of packets
Deep Learning Course2 Week 2 Optimization Algorithms Exercises
sys_kill系统调用
Chapter 11 Working with Dates and Times
欧拉路径与欧拉回路
13、学习MySQL 分组
How do programmers solve online problems gracefully?
What is CICD excuse me
problem solved
PostgreSQL Basics--Common Commands
Nacos配置中心之加载配置
关于ETL的两种架构(ETL架构和ELT架构)
CF1705D Mark and Lightbulbs
Go 微服务开发框架DMicro的设计思路
隔离和降级
别看了,这就是你的题呀
Create virtual environments with virtualenv and Virtualenvwrapper virtual environment management tools