Is this regex correct for what I'm trying to do?
So, first-off, I will admit, I know little about regex patterns. I'm trying to get a noscript to identify a \[music\] track filename with a track number, and only if the track number is a single digit, add a leading zero. I'm gonna get some cringes from the audience here, but please be gentle; I'm still very much a beginner, this is how the code for that looks at the moment, and spoiler alert, though no surprise to some, it doesn't work:
[if..then block begins]
elif [[ $filename =~ ^[0-9]+\ .+\.mp3$ ]]; then
local track_number=$(echo "$filename" | cut -d' ' -f1)
local noscript=$(echo "$filename" | cut -d' ' -f2-)
# Add leading zero if track number is a single character
if [[ ${#track_number} -eq 1 ]]; then
track_number="0$track_number"
fi
local new_filename="${track_number} ${noscript}"
if [[ "$filename" != "$new_filename" ]]; then
mv "$mp3_file" "$sub_dir/$new_filename"
log "Renamed: $filename --> $new_filename"
((files_renamed++))
else
log "No changes needed for: $filename"
fi
[if..then block continues]
I have plenty of tracks that are named like "1 Kryptonite.mp3" which I want renamed to "01 Kryptonite.mp3". I have close to 10,000 tracks in my library, so I'm not doing this by hand for the first 9 tracks of 677 albums.
Where am I going wrong, style aside? (I'm literally just trying to get this to work before I make it pretty)
And yes, everything is correctly declared and everything; this is the only part of the noscript I'm having issue with; the rest of the renaming conditions work fine.
https://redd.it/13wviwz
@r_bash
So, first-off, I will admit, I know little about regex patterns. I'm trying to get a noscript to identify a \[music\] track filename with a track number, and only if the track number is a single digit, add a leading zero. I'm gonna get some cringes from the audience here, but please be gentle; I'm still very much a beginner, this is how the code for that looks at the moment, and spoiler alert, though no surprise to some, it doesn't work:
[if..then block begins]
elif [[ $filename =~ ^[0-9]+\ .+\.mp3$ ]]; then
local track_number=$(echo "$filename" | cut -d' ' -f1)
local noscript=$(echo "$filename" | cut -d' ' -f2-)
# Add leading zero if track number is a single character
if [[ ${#track_number} -eq 1 ]]; then
track_number="0$track_number"
fi
local new_filename="${track_number} ${noscript}"
if [[ "$filename" != "$new_filename" ]]; then
mv "$mp3_file" "$sub_dir/$new_filename"
log "Renamed: $filename --> $new_filename"
((files_renamed++))
else
log "No changes needed for: $filename"
fi
[if..then block continues]
I have plenty of tracks that are named like "1 Kryptonite.mp3" which I want renamed to "01 Kryptonite.mp3". I have close to 10,000 tracks in my library, so I'm not doing this by hand for the first 9 tracks of 677 albums.
Where am I going wrong, style aside? (I'm literally just trying to get this to work before I make it pretty)
And yes, everything is correctly declared and everything; this is the only part of the noscript I'm having issue with; the rest of the renaming conditions work fine.
https://redd.it/13wviwz
@r_bash
Reddit
r/bash on Reddit: Is this regex correct for what I'm trying to do?
Posted by u/StrangeCrunchy1 - 1 vote and 4 comments
Is Recursion Stateful or Stateless?
Is recursion a stateful or stateless process?
On one hand, all previous iterations affect the next ones.
On the other hand, the function has no idea that it has ever been called before.
https://redd.it/13x4sbu
@r_bash
Is recursion a stateful or stateless process?
On one hand, all previous iterations affect the next ones.
On the other hand, the function has no idea that it has ever been called before.
https://redd.it/13x4sbu
@r_bash
Reddit
r/bash on Reddit: Is Recursion Stateful or Stateless?
Posted by u/Independent-Park9987 - No votes and no comments
How to use scale in bc (for division) within a bash noscript and set it as a variable?
Hi, I am modifying a brightness volume bash noscript for my i3wm setup. The original noscript requires xbacklight which doesnt work on my system, so I need to tweak it a little. Anyway, this part of the noscript:
function show_brightness_notif {
brightness=${get_brightness}
# some more codes below for dunstify
}
The idea is that I need to divide this brightness by the max brightness, so I can get a percentage. I found out that you can do float arithmetic using bc, so:
function show_brightness_notif {
brightness=${get_brightness}
bc -l <<< $brightness/$max_brightness
}
This `max_brightness` is set outside the function as global, it is a fixed number. If I do this, calling the function from the command line will indeed show the decimal result. Problem is: it has a lot of decimal places. A quick search shows that you can limit decimal place using scale: [https://askubuntu.com/questions/217570/bc-set-number-of-digits-after-decimal-point](https://askubuntu.com/questions/217570/bc-set-number-of-digits-after-decimal-point)
But where do I write this `scale` variable? More specifically, how do I put everything (the division using bc, the scale) into 1 variable? Ideally, I would use dunst to output this variable.
https://redd.it/13xip20
@r_bash
Hi, I am modifying a brightness volume bash noscript for my i3wm setup. The original noscript requires xbacklight which doesnt work on my system, so I need to tweak it a little. Anyway, this part of the noscript:
function show_brightness_notif {
brightness=${get_brightness}
# some more codes below for dunstify
}
The idea is that I need to divide this brightness by the max brightness, so I can get a percentage. I found out that you can do float arithmetic using bc, so:
function show_brightness_notif {
brightness=${get_brightness}
bc -l <<< $brightness/$max_brightness
}
This `max_brightness` is set outside the function as global, it is a fixed number. If I do this, calling the function from the command line will indeed show the decimal result. Problem is: it has a lot of decimal places. A quick search shows that you can limit decimal place using scale: [https://askubuntu.com/questions/217570/bc-set-number-of-digits-after-decimal-point](https://askubuntu.com/questions/217570/bc-set-number-of-digits-after-decimal-point)
But where do I write this `scale` variable? More specifically, how do I put everything (the division using bc, the scale) into 1 variable? Ideally, I would use dunst to output this variable.
https://redd.it/13xip20
@r_bash
Ask Ubuntu
bc: set number of digits after decimal point
bc handles numbers as integers:
# echo "100/3" | bc
33
bc -l handles numbers as floating point objects:
# echo "100/3" | bc -l
33.33333333333333333333
Is there a way to limit the number of digits...
# echo "100/3" | bc
33
bc -l handles numbers as floating point objects:
# echo "100/3" | bc -l
33.33333333333333333333
Is there a way to limit the number of digits...
Ksh etc. in 2023?
What do you guys think about still using a shell like the C shell or the Ksh shell? Are they still worth using?
https://redd.it/13xjds0
@r_bash
What do you guys think about still using a shell like the C shell or the Ksh shell? Are they still worth using?
https://redd.it/13xjds0
@r_bash
Reddit
r/bash on Reddit: Ksh etc. in 2023?
Posted by u/ignxcy - No votes and no comments
Adding the value of an array to a variable
Im just learning bash so this question mighta bit stupid. What im trying to do, is to add the values of every colum of an array, that contain 100 letters at maximum, to an Variable and give out the sum. For this i have created the following noscript:
When executing i get the following error message:
line 5: 0 + : syntax error: operand expected (error token is "+ ")
How can i fix this?
https://redd.it/13xry3j
@r_bash
Im just learning bash so this question mighta bit stupid. What im trying to do, is to add the values of every colum of an array, that contain 100 letters at maximum, to an Variable and give out the sum. For this i have created the following noscript:
#!/bin/bash read save[1000] i=0 sum=0 while (($i < 1000)); do sum=$(($sum + ${save[$i]})) ((i++)) done echo $sumWhen executing i get the following error message:
line 5: 0 + : syntax error: operand expected (error token is "+ ")
How can i fix this?
https://redd.it/13xry3j
@r_bash
Reddit
r/bash on Reddit: Adding the value of an array to a variable
Posted by u/cows_are_underrated_ - No votes and no comments
Installer noscript for CMake, Ninja, and Meson
I thought I would share my custom installer noscript for the latest GitHub versions of CMake, Ninja, and Meson.
It uses GitHub's API to grab the latest tag version of each repo and will install the static binaries to
bash <(curl -sSL https://build-tools.optimizethis.net)
This is my GitHub repo in case anyone wants to check it out before using: GitHub Script Repo
I hope someone finds this useful. (I know apt works but it doesn't install the latest versions usually).
And please let me know if something is wrong so I can make changes. =)
https://redd.it/13xy52n
@r_bash
I thought I would share my custom installer noscript for the latest GitHub versions of CMake, Ninja, and Meson.
It uses GitHub's API to grab the latest tag version of each repo and will install the static binaries to
/usr/local/binbash <(curl -sSL https://build-tools.optimizethis.net)
This is my GitHub repo in case anyone wants to check it out before using: GitHub Script Repo
I hope someone finds this useful. (I know apt works but it doesn't install the latest versions usually).
And please let me know if something is wrong so I can make changes. =)
https://redd.it/13xy52n
@r_bash
GitHub
GitHub - Kitware/CMake: Mirror of CMake upstream repository
Mirror of CMake upstream repository. Contribute to Kitware/CMake development by creating an account on GitHub.
Maximize Productivity Of The Bash Shell
https://bluz71.github.io/2023/06/02/maximize-productivity-of-the-bash-shell.html
https://redd.it/13y4pg6
@r_bash
https://bluz71.github.io/2023/06/02/maximize-productivity-of-the-bash-shell.html
https://redd.it/13y4pg6
@r_bash
I don't understand how this lines with arrays works
Hello guys, we talked about bash arrays in our shell noscripting course and the professor gave us this demonstration of a cool use of bash arrays but I am not able to understand why this works.
declare -A SELECTOR
declare -A SOMEDATA
declare -A OTHERDATA
SELECTORsome='SOMEDATA$KEY'
SELECTORother='OTHERDATA$KEY'
SOMEDATAfirstkey=somefirstvalue
SOMEDATAsecondkey=somesecondvalue
OTHERDATAfirstkey=otherfirstvalue
OTHERDATAsecondkey=othersecondvalue
KEY=firstkey
DATASET=some
echo ${!SELECTOR$DATASET}
#somefirstvalue
As I know, from bash manual:
>It is possible to obtain the keys (indices) of an array as well as the values. ${!name[@\]} and ${!name[*\]} expand to the indices assigned in array variable name. The treatment when in double quotes is similar to the expansion of the special parameters ‘@’ and ‘*’ within double quotes.
How this syntax of getting the assigned keys of an array let you create this dynamic dataset selection? I am not understanding the step-by-step expansions and operations performed by the shell. Also, I would like to know if any known shell noscripts have used this approach to see a more consistent-real use.
Thanks.
https://redd.it/13yabi7
@r_bash
Hello guys, we talked about bash arrays in our shell noscripting course and the professor gave us this demonstration of a cool use of bash arrays but I am not able to understand why this works.
declare -A SELECTOR
declare -A SOMEDATA
declare -A OTHERDATA
SELECTORsome='SOMEDATA$KEY'
SELECTORother='OTHERDATA$KEY'
SOMEDATAfirstkey=somefirstvalue
SOMEDATAsecondkey=somesecondvalue
OTHERDATAfirstkey=otherfirstvalue
OTHERDATAsecondkey=othersecondvalue
KEY=firstkey
DATASET=some
echo ${!SELECTOR$DATASET}
#somefirstvalue
As I know, from bash manual:
>It is possible to obtain the keys (indices) of an array as well as the values. ${!name[@\]} and ${!name[*\]} expand to the indices assigned in array variable name. The treatment when in double quotes is similar to the expansion of the special parameters ‘@’ and ‘*’ within double quotes.
How this syntax of getting the assigned keys of an array let you create this dynamic dataset selection? I am not understanding the step-by-step expansions and operations performed by the shell. Also, I would like to know if any known shell noscripts have used this approach to see a more consistent-real use.
Thanks.
https://redd.it/13yabi7
@r_bash
Reddit
r/bash on Reddit: I don't understand how this lines with arrays works
Posted by u/himthatni-guh - No votes and 1 comment
How do I open a dir/filename with cat command?
For simplicity: I have a directory that contains two things: a setup noscript file, and another directory containing a text file with VS Code extensions, one per line. The paths to the two files would be:
I have this line in the setup noscript from this superuser topic:
cat VSCode/extensions.txt | xargs -n 1 code --install-extension
I get
https://redd.it/13ym85l
@r_bash
For simplicity: I have a directory that contains two things: a setup noscript file, and another directory containing a text file with VS Code extensions, one per line. The paths to the two files would be:
~/Downloads/noscripts/setupnoscript~/Downloads/noscripts/VSCode/extensions.txtI have this line in the setup noscript from this superuser topic:
cat VSCode/extensions.txt | xargs -n 1 code --install-extension
I get
No such file or directory errors when I run this line; despite trying a number of ways to get it to recognize the file like different path prefixes (/, ./, ../) and even putting extensions.txt in the same directory as setupnoscript. Where am I going wrong?https://redd.it/13ym85l
@r_bash
Super User
How do I back up my VS Code settings and list of installed extensions?
I've just been through the VS Code installation process twice. The initial install is quick and painless (as is the editor itself), but I have had to remember the list of extensions I installed an...
Script to simply read value give a not found error ?
Hi
I have a quite simple noscript and somehow i can't figure how to fix it.. It give me a not found all the time. If some do see the point...
nano /sbin/tempcpunotif.sh
​
Or i try with a simpler one, but not sure as i told me the temp is not found..:
​
​
​
Thanks in advance
https://redd.it/13yswnh
@r_bash
Hi
I have a quite simple noscript and somehow i can't figure how to fix it.. It give me a not found all the time. If some do see the point...
nano /sbin/tempcpunotif.sh
#!/bin/bashwhile true; doval=$(sensors | awk '/temp1/ {print $2}')max="+75.0"if [[ "$val" > "$max" ]]; thensystemctl suspendfisleep 10clearsensorsdoneexit 0​
Or i try with a simpler one, but not sure as i told me the temp is not found..:
​
#!/bin/sh# Threshold for when to send alertthreshold=75000​
#sensors | grep -e "Package id 0" | while read line; docat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_input | while read line; dotemp=$(echo $line | awk -F "+" '{ print $2 }' | awk -F "." '{ print $1 }');if (( temp > $threshold )); then sh /sbin/tempnotif.shfi;done​
Thanks in advance
https://redd.it/13yswnh
@r_bash
Reddit
r/bash on Reddit: Script to simply read value give a not found error ?
Posted by u/Docop1 - No votes and no comments
What is this command?
I have a noscript that should run only when certain directory exists. It begins like that:
-d /home/path/to/directory &&
I found that example somewhere and it works, but I don't understand what these brackets really do. Is it correct way?
https://redd.it/13z8dfl
@r_bash
I have a noscript that should run only when certain directory exists. It begins like that:
-d /home/path/to/directory &&
I found that example somewhere and it works, but I don't understand what these brackets really do. Is it correct way?
https://redd.it/13z8dfl
@r_bash
Reddit
r/bash on Reddit: What is this command?
Posted by u/VoivodeVukodlak - No votes and 9 comments
Curious Bash: Get Notified When It's Done
https://blog.carlolobrano.com/posts/2023-06-02-curious-bash-get-notified-when-done/
https://redd.it/13zj9ly
@r_bash
https://blog.carlolobrano.com/posts/2023-06-02-curious-bash-get-notified-when-done/
https://redd.it/13zj9ly
@r_bash
IT works, for me.
Curious Bash: Get Notified When It's Done
Bash noscripting is a powerful tool that allows you to automate various tasks on your computer.
Run a noscript into a new "less" istance then go back to the normal shell when the noscript has finished
Scenario: I want run a noscript into a terminal window, but to keep this window "clean" (ie I want to display only START and FINISHED) I want to display all the outputs into a clean space (like into the "less" command or even by opening it in "xterm"), then when the noscript has finisced I want to come back to the terminal window, automatically, so without having to press a key (like Q in "less"). All I want to see on that window is START and FINISCED! Nothing more. How should I do? I'm going mad!
https://redd.it/13zo2g6
@r_bash
Scenario: I want run a noscript into a terminal window, but to keep this window "clean" (ie I want to display only START and FINISHED) I want to display all the outputs into a clean space (like into the "less" command or even by opening it in "xterm"), then when the noscript has finisced I want to come back to the terminal window, automatically, so without having to press a key (like Q in "less"). All I want to see on that window is START and FINISCED! Nothing more. How should I do? I'm going mad!
https://redd.it/13zo2g6
@r_bash
Reddit
r/bash on Reddit: Run a noscript into a new "less" istance then go back to the normal shell when the noscript has finished
Posted by u/am-ivan - No votes and no comments
Idempotent mutation of PATH-like env variables
It always bothered me that every example of altering colon-separated values in an environment variable such as
# function to prepend paths in an idempotent way
prependpath() {
local dir="${1%/}" # discard trailing slash
local var="${2:-PATH}"
if [ -z "$dir" ]; then
echo "Usage: prependpath <pathtoprepend> name_of_path_var" >&2
return 2 # incorrect usage return code, may be an informal standard
fi
local newvalue=${!var}
[ $newvalue =~ ^$dir: ] && return # quit if value already starts with $dir
newvalue=${newvalue%:$dir} # remove $dir from end of path
newvalue=${newvalue//:$dir:/:} # remove $dir from middle of path
# prepend the new entry
export ${var}="$dir:$newvalue"
}
Usage examples:
prependpath $HOME/.linuxbrew/lib LDLIBRARYPATH
prependpath $HOME/.nix-profile/bin
Note that of course the order matters; the last one to be prepended that matches, triggers first, since it's put earlier in the PATHlike. Also, due to the use of some Bash-only features (I believe) such as the
EDIT: code modified per /u/rustyflavor 's recommendations, which were good. thanks!!
https://redd.it/13zmp3w
@r_bash
It always bothered me that every example of altering colon-separated values in an environment variable such as
PATH or LD_LIBRARY_PATH (usually by prepending a new value) wouldn't bother to check if it was already in there and delete it if so, leading to garbage entries and violating idempotency (in other words, re-running the same command WOULD NOT result in the same value, it would duplicate the entry). So I present to you, prepend_path:# function to prepend paths in an idempotent way
prependpath() {
local dir="${1%/}" # discard trailing slash
local var="${2:-PATH}"
if [ -z "$dir" ]; then
echo "Usage: prependpath <pathtoprepend> name_of_path_var" >&2
return 2 # incorrect usage return code, may be an informal standard
fi
local newvalue=${!var}
[ $newvalue =~ ^$dir: ] && return # quit if value already starts with $dir
newvalue=${newvalue%:$dir} # remove $dir from end of path
newvalue=${newvalue//:$dir:/:} # remove $dir from middle of path
# prepend the new entry
export ${var}="$dir:$newvalue"
}
Usage examples:
prependpath $HOME/.linuxbrew/lib LDLIBRARYPATH
prependpath $HOME/.nix-profile/bin
Note that of course the order matters; the last one to be prepended that matches, triggers first, since it's put earlier in the PATHlike. Also, due to the use of some Bash-only features (I believe) such as the
${!var} construct, it's only being posted to /r/bash =)EDIT: code modified per /u/rustyflavor 's recommendations, which were good. thanks!!
https://redd.it/13zmp3w
@r_bash
Reddit
r/bash on Reddit: Idempotent mutation of PATH-like env variables
Posted by u/ABC_AlwaysBeCoding - No votes and 2 comments
How to recursively rename photographs/videos to their respective folder name
To preface, I'm very new to bash. I have several thousand photographs and videos that I imported from Photos (macOS) and they were stored in folders based on their date. I'm not on Fedora and using gThumb and I cannot view all of my photographs/videos at once since there are so many sub-folders. I'd like to have them all in one folder, but still organized. So, as the noscript states, I'd like help writing a noscript that could recursively scan a directory (including one tier of sub-folders) and rename each photograph/video to the respective directory. Even better if it could remove any alphabetical letters.
Here's an example of a directory: Christmas Eve, December 24, 2018
Here's an example of what I'd like the files to be named: 12-24-2018 (1), 12-24-2018 (2), etc.
This way all of my photographs/videos could be stored in one folder.
Here's something I had tried:
It obviously doesn't work, but I'd appreciate any help in fixing my errors.
https://redd.it/13zuyrj
@r_bash
To preface, I'm very new to bash. I have several thousand photographs and videos that I imported from Photos (macOS) and they were stored in folders based on their date. I'm not on Fedora and using gThumb and I cannot view all of my photographs/videos at once since there are so many sub-folders. I'd like to have them all in one folder, but still organized. So, as the noscript states, I'd like help writing a noscript that could recursively scan a directory (including one tier of sub-folders) and rename each photograph/video to the respective directory. Even better if it could remove any alphabetical letters.
Here's an example of a directory: Christmas Eve, December 24, 2018
Here's an example of what I'd like the files to be named: 12-24-2018 (1), 12-24-2018 (2), etc.
This way all of my photographs/videos could be stored in one folder.
Here's something I had tried:
#!/bin/bashfor i in ~/Pictures/*/*.png;do $parentFolder = dirname $i;mv $i $parentFolder.png;echo "Renamed $i to $parentFolder.png";doneIt obviously doesn't work, but I'd appreciate any help in fixing my errors.
https://redd.it/13zuyrj
@r_bash
Reddit
r/bash on Reddit: How to recursively rename photographs/videos to their respective folder name
Posted by u/obculte - No votes and 1 comment
these lines causing errors but I swear they weren't causing error before and I didn't change anything
i=0
while read l
do
varr=$(printf "$l" | awk --field-separator="|" "{ print NF }" )
"$varr" -eq 2 || "$varr" -eq 4 || i=$((i+2))
done < file
the error is this
[: Illegal number:
https://redd.it/140q88d
@r_bash
i=0
while read l
do
varr=$(printf "$l" | awk --field-separator="|" "{ print NF }" )
"$varr" -eq 2 || "$varr" -eq 4 || i=$((i+2))
done < file
the error is this
[: Illegal number:
https://redd.it/140q88d
@r_bash
Reddit
r/bash on Reddit: these lines causing errors but I swear they weren't causing error before and I didn't change anything
Posted by u/Aeul289 - No votes and 1 comment
Dispatcher does nothing on my machine?
I am using this commonly known noscript which isn't working for me at all. As in, no output and no changes in WiFi status:
​
#!/bin/bash
enabledisablewifi ()
{
result=$(nmcli dev | grep "ethernet" | grep -w "connected")
if -n "$result" ; then
nmcli radio wifi off
# echo "off"
else
nmcli radio wifi on
# echo "on"
fi
}
if "$2" = "up" ; then
enabledisablewifi
fi
if "$2" = "down" ; then
enabledisablewifi
fi
This is my output of "nmcli dev | grep "ethernet" | grep -w "connected"
enp52s0f3u1u3u4 ethernet connected My Ethernet
What am I doing wrong? :o
https://redd.it/1414kpb
@r_bash
I am using this commonly known noscript which isn't working for me at all. As in, no output and no changes in WiFi status:
​
#!/bin/bash
enabledisablewifi ()
{
result=$(nmcli dev | grep "ethernet" | grep -w "connected")
if -n "$result" ; then
nmcli radio wifi off
# echo "off"
else
nmcli radio wifi on
# echo "on"
fi
}
if "$2" = "up" ; then
enabledisablewifi
fi
if "$2" = "down" ; then
enabledisablewifi
fi
This is my output of "nmcli dev | grep "ethernet" | grep -w "connected"
enp52s0f3u1u3u4 ethernet connected My Ethernet
What am I doing wrong? :o
https://redd.it/1414kpb
@r_bash
Reddit
r/bash on Reddit: Dispatcher does nothing on my machine?
Posted by u/zakazak - No votes and 1 comment