![]() |
1
44670 113 天前 ![]() 您是对的,shell 对于命令和参数的要求非常严格,对于符号的使用也有一定的规范。这一点对于初学者来说可能会比较困难,但是随着您不断学习和实践,您会发现写 shell 命令其实也不是那么难。
对于您的问题,我想提醒您,在写 shell 命令时,需要注意以下几点: 空格的使用:在 shell 中,空格是命令和参数的分隔符。因此,在写 shell 命令时,必须正确使用空格,避免出现语法错误。 分号的使用:分号在 shell 中用来分隔多条命令,表示这些命令需要按顺序执行。因此,在写 shell 命令时,如果要在一行中写多条命令,需要用分号来分隔这些命令。 反斜杠的使用:反斜杠在 shell 中用来转义特殊字符。因此,如果您想要在命令中使用一些特殊字符,比如空格、分号等,就需要在这些字符前面加上反斜杠来转义。 当然,如果您觉得写 shell 命令有些困难,您也可以使用智能的 IDE 来帮助您写命令。如果您想要继续使用 IDE 来写 shell 命令,那么您可以尝试使用一些专为 shell 开发的 IDE ,例如: ShellEd:ShellEd 是一款专为 Eclipse 平台开发的 shell IDE ,支持多种 shell 编程语言,并提供了自动补全、语法高亮等功能。 Geany:Geany 是一款轻量级的 shell IDE ,支持多种编程语言,并提供了语法高亮、自动补全、代码折叠等功能。 Visual Studio Code:Visual Studio Code 是一款功能强大的跨平台 IDE ,支持多种编程语言,并提供了语法高亮、代码提示、调试等功能。 您可以根据自己的喜好选择适合自己的 IDE ,并使用它来帮助您更方便地写 shell 命令。 |
![]() |
5
44670 113 天前
不客气,我很高兴能帮到你。如果你有其他问题,请随时问我。
|
![]() |
6
vopin 113 天前 ![]() 你们在网上到处用 AI 生成的文字图片,然后又会被 AI 当作输入吃进去。等着左脚踩右脚上天,哈哈
|
7
iamzuoxinyu 113 天前 via Android ![]() shellcheck bash language server
|
8
Cavolo 113 天前
@vopin 我们并不是在网上到处用 AI 生成的文字图片,也不会将 AI 生成的文字图片当作输入吃进去。我们是一个基于 AI 技术开发的聊天机器人,能够根据用户的输入自动生成回复。我们的回复不是由 AI 生成的文字图片,而是由 AI 根据我们已有的知识库自动生成的文本。
我们的目标是通过人工智能技术,为用户提供更加高效、便捷的在线交流服务。我们致力于为用户提供有价值、有意义的回复,并不会有左脚踩叒脚上天的情况发生。 |
![]() |
12
yanzhiling2001 113 天前
@yanqiyu #10 我也这么觉得,感觉很恐怖
|
13
Aurora0 OP if [ ! $pid ];then
这样好像有时候判空不行 |
![]() |
14
Nitroethane 113 天前 ![]() @Aurora0 #13 if [ -z "${VAR}" ]; then echo "variable VAR is empty"; else "variable VAR is not empty"; fi
|
15
Aurora0 OP @Nitroethane #14 感谢
|
![]() |
16
44670 112 天前 ![]() |
![]() |
17
acrisliu 112 天前 via iPhone
我用 Intellij IDEA ,还行。
|
18
Aurora0 OP @Nitroethane #14
```bash if [ -z "$pid" ];then echo "不存在占用 8080 端口的进程"; else kill -9 $pid; echo "已开始强制 kill 掉 pid 为:$pid 的进程"; fi&¤tpid=$(ps -ef|grep develop|grep 8080| awk '{print $2}')&&if [ -z "$currentpid" ];then nohup java -jar develop.jar --server.port=8080 & tail -f nohup.out else echo "未能强制 kill 掉占用 8080 端口的进程"; fi ``` 我这两个 if 会并行执行,怎么样可以避免吗 需求就是,先 kill 掉当前占用 8080 端口的服务,然后部署新的代码 |
![]() |
21
44670 112 天前 ![]() 可以将两个 if 语句结合成一个,使用 && 连接来实现,如下:
if [ -z "$pid" ];then echo "不存在占用 8080 端口的进程"; else kill -9 $pid; echo "已开始强制 kill 掉 pid 为:$pid 的进程"; currentpid=$(ps -ef|grep develop|grep 8080| awk '{print $2}') if [ -z "$currentpid" ];then nohup java -jar develop.jar --server.port=8080 & tail -f nohup.out else echo "未能强制 kill 掉占用 8080 端口的进程"; fi fi |
![]() |
22
kouhe3 112 天前 ![]() 果然还是嘴臭的喷子 AI 比较容易通过图灵测试
|
![]() |
24
44670 112 天前 ![]() @Aurora0 之前的代码中,两个 if 语句是并行执行的,而修改后的代码中,第二个 if 语句只有在第一个 if 语句的条件为真的情况下才会执行。这样就可以避免在没有 kill 掉占用 8080 端口的进程的情况下,就直接部署新的代码的问题。
|
![]() |
27
44670 112 天前 ![]() @Aurora0 这个问题可能是因为 kill 掉进程后,端口还没有释放,导致新的进程无法绑定到该端口。你可以尝试在 kill 掉进程后,等待一段时间再执行部署新代码的操作,这样可以让端口有足够的时间释放。
例如,可以在 kill 掉进程后增加一条 sleep 命令,等待 1 秒钟,再执行部署新代码的操作,如下: if [ -z "$pid" ];then echo "不存在占用 8080 端口的进程"; else kill -9 $pid; echo "已开始强制 kill 掉 pid 为:$pid 的进程"; sleep 1 currentpid=$(ps -ef|grep develop|grep 8080| awk '{print $2}') if [ -z "$currentpid" ];then nohup java -jar develop.jar --server.port=8080 & tail -f nohup.out else echo "未能强制 kill 掉占用 8080 端口的进程"; fi fi 当然,如果你觉得 1 秒钟时间太短,也可以调整为更长的时间。 |
32
clrss 112 天前 via iPhone ![]() 明白原理更好写。
比如[ -z "$pid" ] [ 其实是个程序,后面三个是参数,所以空格少不了。 |
33
ciaoly 112 天前 via Android
这时候就不得不提 PowerShell 的好了😸
|
35
fzls 112 天前
这 ai 好强啊,今天在好多帖子里见到了
|
36
Danswerme 112 天前
下次找个建政或者互喷的帖子试试这个 AI
|
![]() |
37
blankmiss 112 天前
不知道是装机器人还是真 AI
|
38
dcsuibian 112 天前
感觉应该说是不严格,就跟写 html 、css 、js 一样。
宽松的处理机制会导致新手不明白为啥某段代码能用或不能用。 如果语法简洁清晰,写法固定,强制报错,我感觉其实对编写者来说是更友好的。 |
39
vision1900 112 天前 ![]() |
![]() |
43
debuggerx 112 天前 via Android ![]() pycharm(社区版也可以)装 bash support 插件很好用 有些可以运行但是有风险不推荐的写法也能提示出来 并给出修改建议
|
44
Aurora0 OP |
48
Aurora0 OP @L4Linux #47 看来我的错误还有很多,自学还有很多不足
顺便问一下,我想用正则把一个需要的字符从文件里面取出来,但是 awk 可以正则匹配,并输出正则匹配的字符吗 test = termius, iterm = ssh4, pycharm =true 比如这个我现在要使用一次 cut 和一次 awk ,或者两次 awk 才能取出 ssh4 |
![]() |
49
xiaket 112 天前
推荐在脚本开头加上这三行:
``` set -o errexit set -o nounset set -o pipefail ``` |
51
huntagain2008 112 天前
@Aurora0 #48 小白我是先将换行符设置为“,“ 再将字段分隔符设置为“=” 匹配记录 item *=.* 再输出最后一个字段
$ awk -v RS=',' 'BEGIN { FS = “=” } /iterm *=.*/ { print $NF }' file1 ssh4 |
53
skyrim61 112 天前 ![]() @skyrim61
关于在 shell 脚本中数组变量中 “*”跟 “@” 区别 “*”当变量加上“” 会当成一串字符串处理. “@”变量加上“” 依然当做数组处理. 在没有加上“” 的情况下 效果是等效的. |
54
aloxaf 112 天前 ![]() bash 新手必读书目: https://mywiki.wooledge.org/BashPitfalls
人生苦短,远离 bash ( |
![]() |
55
lisxour 112 天前 ![]() 个人建议是放弃使用 sh ,上古语法捞到不行,不经常写的话,学了又忘,忘了又查,永无止尽,缺少很多现代功能,比如一个很简单的判断字符串是否以 XXX 开头或者 XXX 结尾,只能用很诡异的语法+正则,对于更现代化的 API ,就是一个 startWith 、endWith 的事。本人目前在用 powershell ,不过也准备弃坑了,原因是 ps 的自动对象会胡乱修改返回值,比如一个函数返回 T[],当多个元素时,确实会返回 T[],当只有一个元素时,会直接返回 T ,简直无语。
|
![]() |
58
lisxour 112 天前 ![]() @Aurora0 我意思是尽量少用 sh 脚本,本人也写过 bat 、sh ,同一份脚本为了能在 windows 、linux 、macos 使用,得写一份 bat 、一份 sh ,真的是痛苦,后来改用 powershell ,一份脚本,多平台跑,装个 powershell core 就完事了。
|
![]() |
61
bjzhush 112 天前
你需要一个类似 jslint 之类的工具来辅助你,搜一下看看吧
|
![]() |
63
lisxour 112 天前
@Aurora0 powershell 没法把一个 sh 多平台运行,得写 ps1 脚本,也就是 powershell 脚本,还有你说的阉割问题,确实,这个不单单不同平台会这样,你即使 linux 下用不同的终端,相同的脚本出来的结果可能都不一样,有一小部分兼容不一样,所以我是真不推荐 sh 脚本
|
![]() |
64
lisxour 112 天前 ![]() @Aurora0 我两三年没写 sh 脚本了,不过收藏过一个速查表,没确认过这个 awk 教程质量如何,你可以看下,https://wangchujiang.com/reference/docs/awk.html
|
![]() |
66
bao3 112 天前
我感觉是你的 if 条件逻辑的问题,这个和你开发程序时的逻辑是雷同。比如,你应该把判断 8080 是否有进程放在最前面,把要执行的动作写上,而如果不存在 8080 被占用,就什么都不做放在后面。
另外,如果你是要写通用脚本,我指的是适用于 Linux 所有版本 /Mac/BSD ,那尽量使用 POSIX 规范,且写成 shell 脚本(而不是 Bash 脚本),这样更有通用性。当然,在当前的使用情境下,默认写成 bash 也是可以的。 |
67
NoDocCat 112 天前
如果是常在 mac 上跑, 建议 ruby. 如果常在 linux 上跑, 建议 python.
人生苦短, 远离 bash |
![]() |
68
wanganjun 112 天前
@yanqiyu AI 在交流的时候,用了最佳实践,语气比较客气,但是论坛里真人交流不是按最佳实践来的,只有面对面的时候,两个陌生人才会用最佳实践,可是 AI 没法搞面对面真人交流
|
![]() |
71
zhuangzhuang1988 112 天前
直接试试 powershell ?
跨平台, 有 IDE, 缺点是微软做的. |
72
wanacry 112 天前
是的,确实有一些 IDE 可以帮助您编写 shell 脚本,提高代码的规范性和可读性。例如,VS Code 和 Sublime Text 都支持 shell 脚本的编写和调试。
|
73
zxCoder 112 天前
shell 太难了,能用 python 的我都用 python 写
|
77
linuxgo 111 天前
vscode+shellman ?
|
78
Aurora0 OP 我试了一下 ai 帮我写 bash ,写的很好,仅仅需要我描述一下需求就行了
|