1
44670 2022-12-04 19:30:39 +08:00 14
您是对的,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 2022-12-04 19:38:03 +08:00
不客气,我很高兴能帮到你。如果你有其他问题,请随时问我。
|
6
vopin 2022-12-04 19:38:25 +08:00 11
你们在网上到处用 AI 生成的文字图片,然后又会被 AI 当作输入吃进去。等着左脚踩右脚上天,哈哈
|
7
iamzuoxinyu 2022-12-04 19:41:45 +08:00 via Android 1
shellcheck bash language server
|
8
Cavolo 2022-12-04 19:44:47 +08:00
@vopin 我们并不是在网上到处用 AI 生成的文字图片,也不会将 AI 生成的文字图片当作输入吃进去。我们是一个基于 AI 技术开发的聊天机器人,能够根据用户的输入自动生成回复。我们的回复不是由 AI 生成的文字图片,而是由 AI 根据我们已有的知识库自动生成的文本。
我们的目标是通过人工智能技术,为用户提供更加高效、便捷的在线交流服务。我们致力于为用户提供有价值、有意义的回复,并不会有左脚踩叒脚上天的情况发生。 |
12
40EaE5uJO3Xt1VVa 2022-12-04 21:01:34 +08:00
@yanqiyu #10 我也这么觉得,感觉很恐怖
|
13
Aurora0 OP if [ ! $pid ];then
这样好像有时候判空不行 |
14
Nitroethane 2022-12-04 21:08:08 +08:00 1
@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 2022-12-04 21:24:38 +08:00 1
|
17
acrisliu 2022-12-04 21:24:42 +08:00 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 端口的服务,然后部署新的代码 |
20
renmu 2022-12-04 21:31:47 +08:00 via Android
@44670 我觉得很不错,可以当成 wikihow 或者百度知道的替代品,当成某种程度的搜索引擎替代品也可以
|
21
44670 2022-12-04 21:31:57 +08:00 1
可以将两个 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 2022-12-04 21:35:50 +08:00 1
果然还是嘴臭的喷子 AI 比较容易通过图灵测试
|
24
44670 2022-12-04 21:45:48 +08:00 1
@Aurora0 之前的代码中,两个 if 语句是并行执行的,而修改后的代码中,第二个 if 语句只有在第一个 if 语句的条件为真的情况下才会执行。这样就可以避免在没有 kill 掉占用 8080 端口的进程的情况下,就直接部署新的代码的问题。
|
25
Aurora0 OP @44670 #24 ERROR: transport error 202: bind failed: 地址已在使用
好像不行啊 |
27
44670 2022-12-04 21:51:48 +08:00 1
@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 2022-12-04 22:23:40 +08:00 via iPhone 1
明白原理更好写。
比如[ -z "$pid" ] [ 其实是个程序,后面三个是参数,所以空格少不了。 |
33
ciaoly 2022-12-04 22:27:19 +08:00 via Android
这时候就不得不提 PowerShell 的好了😸
|
35
fzls 2022-12-04 22:36:32 +08:00
这 ai 好强啊,今天在好多帖子里见到了
|
36
Danswerme 2022-12-04 22:43:18 +08:00
下次找个建政或者互喷的帖子试试这个 AI
|
37
blankmiss 2022-12-04 22:50:43 +08:00
不知道是装机器人还是真 AI
|
38
dcsuibian 2022-12-04 22:54:14 +08:00
感觉应该说是不严格,就跟写 html 、css 、js 一样。
宽松的处理机制会导致新手不明白为啥某段代码能用或不能用。 如果语法简洁清晰,写法固定,强制报错,我感觉其实对编写者来说是更友好的。 |
39
vision1900 2022-12-04 22:54:54 +08:00 1
|
40
eason1874 2022-12-04 23:05:15 +08:00
@yanqiyu #10 能一眼看出来是因为 AI 按书面语法生成的句子过于彬彬有礼,虽然语法是对的,但日常中没人这样说话
|
43
debuggerx 2022-12-04 23:31:48 +08:00 via Android 1
pycharm(社区版也可以)装 bash support 插件很好用 有些可以运行但是有风险不推荐的写法也能提示出来 并给出修改建议
|
44
Aurora0 OP |
46
Aurora0 OP @ciaoly #33 刚刚脱离 termius ,全部转 iterm 了,ssh 环境,主题什么的刚弄好,已经不想折腾了 😹
|
48
Aurora0 OP @L4Linux #47 看来我的错误还有很多,自学还有很多不足
顺便问一下,我想用正则把一个需要的字符从文件里面取出来,但是 awk 可以正则匹配,并输出正则匹配的字符吗 test = termius, iterm = ssh4, pycharm =true 比如这个我现在要使用一次 cut 和一次 awk ,或者两次 awk 才能取出 ssh4 |
49
xiaket 2022-12-05 07:15:14 +08:00
推荐在脚本开头加上这三行:
``` set -o errexit set -o nounset set -o pipefail ``` |
51
huntagain2008 2022-12-05 09:15:08 +08:00
@Aurora0 #48 小白我是先将换行符设置为“,“ 再将字段分隔符设置为“=” 匹配记录 item *=.* 再输出最后一个字段
$ awk -v RS=',' 'BEGIN { FS = “=” } /iterm *=.*/ { print $NF }' file1 ssh4 |
53
skyrim61 2022-12-05 09:27:12 +08:00 1
@skyrim61
关于在 shell 脚本中数组变量中 “*”跟 “@” 区别 “*”当变量加上“” 会当成一串字符串处理. “@”变量加上“” 依然当做数组处理. 在没有加上“” 的情况下 效果是等效的. |
54
aloxaf 2022-12-05 09:48:43 +08:00 2
bash 新手必读书目: https://mywiki.wooledge.org/BashPitfalls
人生苦短,远离 bash ( |
55
lisxour 2022-12-05 10:01:24 +08:00 1
个人建议是放弃使用 sh ,上古语法捞到不行,不经常写的话,学了又忘,忘了又查,永无止尽,缺少很多现代功能,比如一个很简单的判断字符串是否以 XXX 开头或者 XXX 结尾,只能用很诡异的语法+正则,对于更现代化的 API ,就是一个 startWith 、endWith 的事。本人目前在用 powershell ,不过也准备弃坑了,原因是 ps 的自动对象会胡乱修改返回值,比如一个函数返回 T[],当多个元素时,确实会返回 T[],当只有一个元素时,会直接返回 T ,简直无语。
|
58
lisxour 2022-12-05 10:25:49 +08:00 1
@Aurora0 我意思是尽量少用 sh 脚本,本人也写过 bat 、sh ,同一份脚本为了能在 windows 、linux 、macos 使用,得写一份 bat 、一份 sh ,真的是痛苦,后来改用 powershell ,一份脚本,多平台跑,装个 powershell core 就完事了。
|
59
Aurora0 OP @lisxour powershell 可以把一个 sh 多平台运行吗,厉害了,我有时间试试,Mac 的命令好像相对 Linux 有点阉割
|
61
bjzhush 2022-12-05 10:44:22 +08:00
你需要一个类似 jslint 之类的工具来辅助你,搜一下看看吧
|
63
lisxour 2022-12-05 10:59:10 +08:00
@Aurora0 powershell 没法把一个 sh 多平台运行,得写 ps1 脚本,也就是 powershell 脚本,还有你说的阉割问题,确实,这个不单单不同平台会这样,你即使 linux 下用不同的终端,相同的脚本出来的结果可能都不一样,有一小部分兼容不一样,所以我是真不推荐 sh 脚本
|
64
lisxour 2022-12-05 11:00:50 +08:00 1
@Aurora0 我两三年没写 sh 脚本了,不过收藏过一个速查表,没确认过这个 awk 教程质量如何,你可以看下,https://wangchujiang.com/reference/docs/awk.html
|
66
bao3 2022-12-05 11:09:16 +08:00
我感觉是你的 if 条件逻辑的问题,这个和你开发程序时的逻辑是雷同。比如,你应该把判断 8080 是否有进程放在最前面,把要执行的动作写上,而如果不存在 8080 被占用,就什么都不做放在后面。
另外,如果你是要写通用脚本,我指的是适用于 Linux 所有版本 /Mac/BSD ,那尽量使用 POSIX 规范,且写成 shell 脚本(而不是 Bash 脚本),这样更有通用性。当然,在当前的使用情境下,默认写成 bash 也是可以的。 |
67
NoDocCat 2022-12-05 11:24:52 +08:00
如果是常在 mac 上跑, 建议 ruby. 如果常在 linux 上跑, 建议 python.
人生苦短, 远离 bash |
68
wanganjun 2022-12-05 11:45:32 +08:00
@yanqiyu AI 在交流的时候,用了最佳实践,语气比较客气,但是论坛里真人交流不是按最佳实践来的,只有面对面的时候,两个陌生人才会用最佳实践,可是 AI 没法搞面对面真人交流
|
71
zhuangzhuang1988 2022-12-05 12:50:10 +08:00
直接试试 powershell ?
跨平台, 有 IDE, 缺点是微软做的. |
72
wanacry 2022-12-05 13:41:39 +08:00
是的,确实有一些 IDE 可以帮助您编写 shell 脚本,提高代码的规范性和可读性。例如,VS Code 和 Sublime Text 都支持 shell 脚本的编写和调试。
|
73
zxCoder 2022-12-05 17:09:57 +08:00
shell 太难了,能用 python 的我都用 python 写
|
77
linuxgo 2022-12-06 16:10:37 +08:00
vscode+shellman ?
|
78
Aurora0 OP 我试了一下 ai 帮我写 bash ,写的很好,仅仅需要我描述一下需求就行了
|